【问题标题】:How to run Pitest with Mockito static mocking?如何使用 Mockito 静态模拟运行 Pitest?
【发布时间】:2021-11-26 01:08:01
【问题描述】:

我正在进行的一个项目涉及将我们的代码库更新到 JUnit 5。我们的一些测试类以前一直在使用 PowerMockito 进行静态模拟。由于 PowerMockito 目前不支持 JUnit 5,我们更新了 Mockito 依赖项并切换到使用 Mockito 的静态模拟。这在运行单元测试时大部分都有效,但在使用 ptest 运行测试以获得突变覆盖率时会出现问题。

尽管使用mvn test 或mvn verify 可以正常运行并通过测试,但pitest 会给出错误:

[ERROR] Failed to execute goal org.pitest:pitest-maven:1.5.2:mutationCoverage (default-cli) on project <PROJECT>: Execution default-cli of goal org.pitest:pitest-maven:1.5.2:mutationCoverage failed: 9 tests did not pass without mutation when calculating line coverage. Mutation testing requires a green suite.

提到的 9 个测试是唯一使用 Mockito 静态模拟的测试。

测试通常如下所示:

静态模拟测试示例

@ExtendWith(MockitoExtension.class)
public class SampleTest {

    @Test
    public void sampleTestWithMocking() {
        String param = "test";
        String expected = "value";

        MockedStatic<MyClass> mockStaticMyClass = Mockito.mockStatic(MyClass.class);
        mockStaticMyClass.when(() -> MyClass.myStaticMethod(param)).thenReturn(expected);

        assertEquals(expected, MyClass.myStaticMethod(param));
    }

}

【问题讨论】:

    标签: java mockito pitest


    【解决方案1】:

    Pitest 目前不支持使用 mockito 进行静态模拟。我会看看是否可以支持它,但这可能是一项复杂的任务。对 Powermock 的支持需要使用黑魔法(重写它使用的字节码操作库的字节码),并且总是很脆弱并且很容易被新的 Powermock 版本破坏。

    更好的长期解决方案是从测试套件中消除对静态模拟的需求。尽管它确实有一些用例,但它通常是设计问题的危险信号。

    【讨论】:

    • 感谢您的快速回复!这是有道理的,我们主要将静态模拟用于 AWS 依赖项,因此我们可能会继续使用 JUnit 4/PowerMock,因为这些类将被排除在外。无论如何,再次感谢!
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2014-08-30
    • 2014-02-02
    相关资源
    最近更新 更多