Java PowerMock+Emma-私有静态方法和其他方法的代码覆盖率显示为0%

Java PowerMock+Emma-私有静态方法和其他方法的代码覆盖率显示为0%,java,powermock,powermockito,Java,Powermock,Powermockito,我从中引用了PowerMock,并在这里应用了相同的逻辑。另外,我在eclipse/STS中安装了EMMA开源工具,但是当我运行代码时,我看到零%的代码覆盖率。为什么? public class MyClient { public void publicApi() { System.out.println("In publicApi"); int result = 0; try { result = private

我从中引用了PowerMock,并在这里应用了相同的逻辑。另外,我在eclipse/STS中安装了EMMA开源工具,但是当我运行代码时,我看到零%的代码覆盖率。为什么?

public class MyClient {

    public void publicApi() {
        System.out.println("In publicApi");
        int result = 0;
        try {
            result = privateApi("hello", 1);
        } catch (Exception e) {
            //Assert.fail();
        }
        System.out.println("result : "+result);
        if (result == 20) {
            throw new RuntimeException("boom");
        }
    }

    private static int privateApi(String whatever, int num) throws Exception {
        System.out.println("In privateAPI");
        thirdPartyCall();
        int resp = 10;
        return resp;
    }

    private static void thirdPartyCall() throws Exception{
        System.out.println("In thirdPartyCall");
        //Actual WS call which may be down while running the test cases
    }
}
MyClientTest.java

实际代码覆盖率:

pom.xml


如果您正在构造一个Spy或Mock,那么您就不会调用正在测试的实际代码。spies的目的是能够验证它们,以便通过调用正确的回调或方法来检查代码的正确行为。在模拟的情况下,重点是引导代码沿着特定的控制流路径,并验证与模拟的预期交互

由于您的测试用例调用了spy上的测试方法,因此您的代码覆盖率恰好为0%也就不足为奇了。如果您要用mock方法验证您的交互,您可能会发现没有发生任何事情

相反,您要做的是设置模拟,但以“正常方式”调用测试中的实际代码。其思想是先初始化执行环境,然后“正常”调用已测试的方法调用,最后观察实际发生的情况。最后一位包括对生成的输出的正常断言、对预期交互的验证(这两个交互都发生了),以及这些交互是否涉及预期的参数/值

更改测试代码:

MyClient classUnderTest = PowerMockito.spy(new MyClient());
致:


并观察代码覆盖率。

如果您正在构建间谍或模拟,那么您并没有调用正在测试的实际代码。spies的目的是能够验证它们,以便通过调用正确的回调或方法来检查代码的正确行为。在模拟的情况下,重点是引导代码沿着特定的控制流路径,并验证与模拟的预期交互

由于您的测试用例调用了spy上的测试方法,因此您的代码覆盖率恰好为0%也就不足为奇了。如果您要用mock方法验证您的交互,您可能会发现没有发生任何事情

相反,您要做的是设置模拟,但以“正常方式”调用测试中的实际代码。其思想是先初始化执行环境,然后“正常”调用已测试的方法调用,最后观察实际发生的情况。最后一位包括对生成的输出的正常断言、对预期交互的验证(这两个交互都发生了),以及这些交互是否涉及预期的参数/值

更改测试代码:

MyClient classUnderTest = PowerMockito.spy(new MyClient());
致:


并查看代码覆盖率。

查看您的测试代码。只要您的测试单元只是一个间谍,您就不会攻击您的实际实现,而是模拟/间谍框架为您合成的任何代理。因此,您可以获得0%的代码覆盖率。至于模拟的好处是什么:为您的执行环境注入活力,即模拟您被测试单元的依赖关系的行为。您可以使用mock来确保特定的控制流分支按照您的测试用例的需要进行或不进行。您应该调用被测试的实际单元。基本上这行是错误的:MyClient classUnderTest=PowerMockito.spynew MyClient;因为这给了你一个间谍,而不是被测试的实际单位。记住:间谍不是您想要测试的实际代码!只需像在其他非测试代码中一样,正常地构造被测试的单元,但仍然没有帮助。你能试着在你这边运行这个代码吗?看看你的测试代码。只要您的测试单元只是一个间谍,您就不会攻击您的实际实现,而是模拟/间谍框架为您合成的任何代理。因此,您可以获得0%的代码覆盖率。至于模拟的好处是什么:为您的执行环境注入活力,即模拟您被测试单元的依赖关系的行为。您可以使用mock来确保特定的控制流分支按照您的测试用例的需要进行或不进行。您应该调用被测试的实际单元。基本上这行是错误的:MyClient classUnderTest=PowerMockito.spynew MyClient;因为这给了你一个间谍,而不是被测试的实际单位。记住:间谍不是您想要测试的实际代码!只需像在其他非测试代码中一样,正常地构造被测试的单元,但仍然没有帮助。你能试着在你这边运行这段代码吗?你似乎在准备测试的静态方法,即通过PowerMockito.mockStatic操纵字节码。。。还有@PrepareForTest…,我可以看到您正在使用PowerMockito的when…,thenReturn…,设置测试/模拟行为,但是@user298396是正确的-您的测试中似乎没有任何东西实际在测试中练习/调用您的类…?PowerMock+ECLemma:破坏的覆盖率数据。习惯它。或者尝试cobertura,或者老实说,更好的方法是:学习如何编写易于测试的生产代码,这些代码可以在您的帮助下进行测试
t PowerMockito字节码操纵巫毒魔法。您似乎准备了测试的静态方法,即通过PowerMockito.mockStatic操纵字节码。。。还有@PrepareForTest…,我可以看到您正在使用PowerMockito的when…,thenReturn…,设置测试/模拟行为,但是@user298396是正确的-您的测试中似乎没有任何东西实际在测试中练习/调用您的类…?PowerMock+ECLemma:破坏的覆盖率数据。习惯它。或者尝试cobertura,或者老实说,更好的方法:学习如何编写易于测试的生产代码,这些代码可以在没有PowerMockito字节码操纵巫毒魔法的情况下进行测试。
MyClient classUnderTest = PowerMockito.spy(new MyClient());
MyClient classUnderTest = new MyClient();