Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在PowerMock中模拟私有方法而不使用PrepareFor注释?_Java_Unit Testing_Gradle_Powermock_Jacoco - Fatal编程技术网

Java 如何在PowerMock中模拟私有方法而不使用PrepareFor注释?

Java 如何在PowerMock中模拟私有方法而不使用PrepareFor注释?,java,unit-testing,gradle,powermock,jacoco,Java,Unit Testing,Gradle,Powermock,Jacoco,我正在尝试使用JaCoCo生成代码覆盖率报告。我的公司明确规定我只能使用JaCoCo。不幸的是,在一个测试用例中,我需要使用PowerMock来模拟私有方法。因此,我必须使用@PrepareFor注释和@RunWith(PowerMockRunner.class)注释。当我尝试使用gradle clean build JacoTestReport在gradle中生成报告时,由于注释的原因,代码覆盖率没有覆盖这个测试用例。 有解决方法吗?有两种方法: 如前所述,使用离线JaCoCo检测。例如,你

我正在尝试使用JaCoCo生成代码覆盖率报告。我的公司明确规定我只能使用JaCoCo。不幸的是,在一个测试用例中,我需要使用PowerMock来模拟私有方法。因此,我必须使用@PrepareFor注释和@RunWith(PowerMockRunner.class)注释。当我尝试使用gradle clean build JacoTestReport在gradle中生成报告时,由于注释的原因,代码覆盖率没有覆盖这个测试用例。 有解决方法吗?

有两种方法:

  • 如前所述,使用离线JaCoCo检测。例如,你可能会发现
  • 尝试使用并重新定义包含私有方法的类,并为该方法添加处理程序。ByteBuddy与Javassist不同,它使用已加载的、已经由JaCoCo检测的类
我得到了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有一些超类时,这才有效。这只是一个快速而肮脏的修复,但不是烫发。适用于所有人的解决方案。

PowerMock有一个解决方案。。。好几个月了。我不会屏住呼吸等待尽快修复。不使用PowerMock的众多原因之一。我将查看它并让您知道。谢谢,谢谢!。如果类没有超级类来生成代码覆盖率,我们应该怎么做?@Sayali你做不了多少。如果powermock是测试代码的唯一方法,那么代码本身就不是很好。另一方面,如果您想获得codeCoverage,请查看您的代码是否存在任何异常情况,并尝试模拟这些情况。确保在编写“PrepareForTest”注释的同一测试类中不这样做,否则它将无法工作。为此异常情况创建一个单独的测试类,并对其进行模拟。