[英]Mocking Static method using PowerMockito
我正在使用PowerMockito模拟静态方法以获得更好的线路覆盖率。 测试通过,但Cobertura仍将返回线显示为红色。 我不确定我是否以错误的方式使用PowerMockito。 有什么线索吗?
MUT
public static Object getBean( String beanName ) {
return AppContext.getApplicationContext().getBean( beanName );
}
Junit测试
@RunWith ( PowerMockRunner.class )
@PrepareForTest ( {AppContext.class} )
private ApplicationContext applicationContext;
@Test
public void testGetBean() throws Exception {
String beanName = "junitBean";
applicationContext = Mockito.mock(ApplicationContext.class);
PowerMockito.mockStatic(AppContext.class);
AppContext.setApplicationContext(applicationContext);
PowerMockito.when(AppContext.getApplicationContext()).thenReturn(applicationContext);
PowerMockito.when(AppContext.getApplicationContext().getBean(beanName)).thenReturn(Object.class);
AppContext.getBean(beanName);
}
为了模拟静态方法,PowerMock必须在编译类后修改其类的Java字节码。 代码覆盖率工具以相同的方式工作-它们“检测”字节码(google表示“字节码检测”),以收集有关已运行哪些代码行的信息。
鉴于这里有两件事可以根据自己的需要修改已编译的代码,因此它们不能很好地协同工作就不足为奇了。 实际上,其他覆盖工具也存在相同的问题,例如PowerMock GitHub页面上的此问题 。
正是由于这样的原因,模拟静态方法是一个坏主意,并且仅应在非常特殊的情况下才真正进行。 在大多数情况下,您可以将静态方法调用包装在接口中,然后将接口的实例传递给被测对象,或者更好的方法(如果代码在您的控制之下)删除静态方法并将其替换为实例方法。
您也可以将ApplicationContext
实例直接传递到要测试的类的构造函数中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.