title: 单元测试JMockit使用 tags:
- JMockit
- Junit
- 测试
- Mockup
- Instrumentation categories: 测试 date: 2017-09-21 13:10:15
背景
- 由于目前dubbo等外部依赖越来越多 现在小伙伴关于测试经常跑不通 比如
- 之前也提供了stub方案,但是目前使用的人几乎没有junit测试之第三方组件mock
文章中提到让大家学习使用jMockit 似乎也没有人响应
使用
-
场景需要返回特殊的值(特定异常特定值 非法值等等就OK)
@Test public void testJmockit(){ List mockInstance = new MockUp<List>() { @Mock public String get (int index) { return "aaaa"; } }.getMockInstance(); Assert.assertEquals( mockInstance.get(1),"aaaa"); Assert.assertEquals( mockInstance.get(Integer.MAX_VALUE),"aaaa"); Assert.assertEquals( mockInstance.size(),0); } 复制代码
-
注意此处为接口 调用了getMockInstance 非常神奇的返回了指定的值 并且模拟出了一种size为0但是get一直可以返回特定结果的情况
-
使用spring注解部分依赖特定的外部服务(此处需要依赖网络)
@Test public void testJmockitHttpClient(){ new MockUp<CarZoneHttpClient>() { @Mock public String getJsonString(String requestJsonStr, String requestUrl){ return"我是mocked!"; }; }; Assert.assertEquals( CarZoneHttpClient.getJsonString("",""),"我是mocked!"); } 复制代码
-
很明显这样就可以直接返回了需要的值
-
部分依赖dubbo接口
new MockUp<CustomerCarServiceImpl>(){ @Mock CustomerCarVO synchronizedCustomerCar(CustomerCarVO customerCarVO, int type, boolean notNull) throws UnsupportedEncodingException { return customerCarVO; } }; 复制代码
-
此处业务逻辑可以强行跳过 这样可以不必要依赖指定接口(dubbo,rmi)也可以制造空指针等测试代码异常
严格来说基本上MockUp可以完成绝大部分我能想到的测试场景了~ -
猜猜这是咋实现的~ 下一篇分解