我正在使用PowerMockito模拟一个静态方法,以获得更好的行覆盖率。测试通过了,但是Cobertura仍然将返回线显示为红色。我不确定我是否以错误的方式使用了PowerMockito。有什么线索吗?
静音
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);
}发布于 2016-09-21 02:09:28
要模拟静态方法,PowerMock必须在编译后修改类的Java Byte Code。代码覆盖工具也是以同样的方式工作的--它们“插装”(google中的“字节码插装”)字节码,以便收集关于哪些代码行已经运行的信息。
考虑到这里有两件事根据自己的需要修改已经编译的代码,它们不能很好地协同工作也就不足为奇了。事实上,其他覆盖工具也有同样的问题,例如PowerMock GitHub页面上的this issue。
正是由于这样的原因,模拟静态方法是一个糟糕的想法,只有在非常特殊的情况下才应该这样做。在大多数情况下,您可以将静态方法调用包装在一个接口中,然后将该接口的一个实例传递给被测对象,或者更好的做法是(如果代码在您的控制之下)移除该静态方法并将其替换为一个实例方法。
您也可以直接将ApplicationContext实例传递到被测类的构造函数中。
https://stackoverflow.com/questions/39600021
复制相似问题