如何 运行 使用 Mockito 静态模拟进行 Pitest?

How to run Pitest with Mockito static mocking?

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

尽管测试 运行ning 并通过 mvn testmvn 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));
    }

}

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

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