如何在不使用PowerMock中的PrepareFor注释的情况下模拟私有方法?

时间:2017-04-28 01:09:06

标签: java unit-testing gradle powermock jacoco

我正在尝试使用JaCoCo生成代码覆盖率报告。我的公司是具体的,我必须只使用JaCoCo。不幸的是,有一个测试用例,我需要使用PowerMock来模拟私有方法。所以我必须使用@PrepareFor注释和@RunWith(PowerMockRunner.class)注释。当我尝试使用gradle clean build jacocoTestReport在gradle中生成报告时,由于注释,代码覆盖率并未涵盖此测试用例。 有解决方法吗?

2 个答案:

答案 0 :(得分:0)

您有两种方式:

  • 使用离线JaCoCo检测,如其描述的here。对于Gradle示例,您可能会找到here
  • 尝试使用ByteBuddy并重新定义包含私有方法的类并为该方法添加处理程序。 ByteBuddy与Javassist的不同之处在于,它与已经由JaCoCo类加载的已加载类一起工作。

答案 1 :(得分:0)

我接受了PowerMockito的报道,但我认为它并不适用于所有情况。它只有在要测试的类具有超类时才有效。让我解释一下。

这可能是您要测试的课程

class ClassToBeTested extends/implements SuperClass/interface {
//Code 

}

例如,如果要为名为“ClassToBeTested”的类编写单元测试,并且它有一些必须模拟的私有方法或构造函数。因此,通常您会尝试使用PowerMockito来模拟私有方法,它大致如下所示。

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToBeTested.class)
class ClassToBeTestedTest {
//Lots or some test code here 

}

现在您不会获得“ClassToBeTested”的代码覆盖率。但是在PrepareForTest注释中,如果我们使用超类或由待测试类实现的接口而不是如下所示的原始类。

@RunWith(PowerMockRunner.class)
@PrepareForTest(SuperClass.class)
class ClassToBeTestedTest {
//Lots or some test code here 

}

我得到了代码覆盖率。但是只有当classToBeTested有一些超类时,这才有效。这只是一个快速而肮脏的修复,但不是烫发。适合所有人的解决方案。