首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PowerMockito模拟静态方法

使用PowerMockito模拟静态方法
EN

Stack Overflow用户
提问于 2016-09-21 01:08:33
回答 1查看 654关注 0票数 1

我正在使用PowerMockito模拟一个静态方法,以获得更好的行覆盖率。测试通过了,但是Cobertura仍然将返回线显示为红色。我不确定我是否以错误的方式使用了PowerMockito。有什么线索吗?

静音

代码语言:javascript
复制
 public static Object getBean( String beanName ) {
    return AppContext.getApplicationContext().getBean( beanName );
}

Junit测试

代码语言:javascript
复制
@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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 02:09:28

要模拟静态方法,PowerMock必须在编译后修改类的Java Byte Code。代码覆盖工具也是以同样的方式工作的--它们“插装”(google中的“字节码插装”)字节码,以便收集关于哪些代码行已经运行的信息。

考虑到这里有两件事根据自己的需要修改已经编译的代码,它们不能很好地协同工作也就不足为奇了。事实上,其他覆盖工具也有同样的问题,例如PowerMock GitHub页面上的this issue

正是由于这样的原因,模拟静态方法是一个糟糕的想法,只有在非常特殊的情况下才应该这样做。在大多数情况下,您可以将静态方法调用包装在一个接口中,然后将该接口的一个实例传递给被测对象,或者更好的做法是(如果代码在您的控制之下)移除该静态方法并将其替换为一个实例方法。

您也可以直接将ApplicationContext实例传递到被测类的构造函数中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39600021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档