繁体   English   中英

使用PowerMockito模拟静态方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM