解决单元测试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

  • 12
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值