对于正常通过构造或者注入方式依赖的对象,Mockito还是很好解决依赖关系的,但是如果遇到被测方法内出现 new
依赖的对象,就变得麻烦一些了。
这里举一个比较特殊的例子,new了一个线程对象,实际上该解决方案针对所有通过 new
得到的对象均适用(如 RestTemplate
):
public class A {
public String someMethod() {
//some code...
new MyThread(param1, param2......).run();
//some code...
}
}
Mockito无法解决此类问题,转向使用PowerMockito。测试代码如下:
@RunWith(PowerMockRunner.class)
public class TestA {
@Mock
private MyThread myThread;
@Test
private void testSomeMethod() throws Exception {
//mock code......
PowerMockito.whenNew(MyThread.class).withAnyArguments().thenReturn(myThread);
//Assert......
}
}
启动后并不起作用,mock没有效果,经过多方搜索发现了这两篇博文,完美解决了问题,在此向二位表示感谢。原文地址如下:Java单元测试打桩-mockito,PowerMockito简单使用,模拟方法内new对象,@PrepareForTest的使用场景。
修改的关键在于:将需要mock的 new 对象所在的被测类添加至@PrepareForTest注解中。
修改后的测试类如下,注意抬头的注解:
@RunWith(PowerMockRunner.class)
@PrepareForTest({TestA.class})
public class TestA {
@Mock
private MyThread myThread;
@Test
private void testSomeMethod() throws Exception {
//mock code......
PowerMockito.whenNew(MyThread.class).withAnyArguments().thenReturn(myThread);
//Assert......
}
}
运行代码,完美覆盖。
@PrepareForTest
和 @RunWith(PowerMockRunner.class)
注解需要同时使用,摘抄一下关于@PrepareForTest注解的使用场景:
- 当使用
PowerMockito.whenNew
方法时,注解@PrepareForTest
里写的类是需要mock的new对象代码所在的类 - 当需要mock
final
方法的时候,注解@PrepareForTest
里写final
方法所在类 - 当需要mock
private
方法的时候,注解@PrepareForTest
里写private
方法所在类 - 当需要mock
static
方法的时候,注解@PrepareForTest
里写static
方法所在类
https://blog.csdn.net/ccityzh/article/details/80139807
https://blog.csdn.net/qaz296490709/article/details/72880370