解决单元测试Mockito模拟方法内new对象的问题

对于正常通过构造或者注入方式依赖的对象,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

你可能感兴趣的:(Java,单元测试)