如何验证使用 mockito 调用公共类的静态方法?

use*_*178 3 java mockito

伪代码是这样的

rc = SomePublicClass.myPublicStaticFunc(arg)


public class SomePublicClass {
    private SomePublicClass() {
    }

    public static int myPublicStaticFunc(arg) {
        return 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 UT 这不起作用

verify(SomePublicClass, times(1)). myPublicStaticFunc();
Run Code Online (Sandbox Code Playgroud)

由于这是一个公共类,如何验证 myFunc 在单元测试中的 mockito 中被调用?如果 SomePublicClass 是一个模拟类,这可以工作。

Les*_*iak 6

自 Mockito 3.4 起,可以使用模拟静态方法。

请参阅拉取请求:Mockito #1013:定义并实现用于静态模拟的 API。

请注意,此功能可用的事实并不等同于建议使用它。它针对无法重构源代码的遗留应用程序。

话说回来:

测试静态方法何时不带参数:

try (MockedStatic<SomePublicClass> dummyStatic = Mockito.mockStatic(SomePublicClass.class)) {
    dummyStatic.when(SomePublicClass::myPublicStaticFunc)
               .thenReturn(5);
    // when
    System.out.println(SomePublicClass.myPublicStaticFunc());
    //then
    dummyStatic.verify(
            times(1),
            SomePublicClass::myPublicStaticFunc
    );
}
Run Code Online (Sandbox Code Playgroud)

测试静态方法何时接受参数:

try (MockedStatic<SomePublicClass> dummyStatic = Mockito.mockStatic(SomePublicClass.class)) {
    dummyStatic.when(() -> SomePublicClass.myPublicStaticFunc(anyInt()))
               .thenReturn(5);
    // when
    System.out.println(SomePublicClass.myPublicStaticFunc(7));
    //then
    dummyStatic.verify(
            times(1), 
            () -> SomePublicClass.myPublicStaticFunc(anyInt())
    );
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定这是否是最近的更改,但在mockito 4.2中,验证参数与列出的参数相反。`dummyStatic.verify(() -&gt; SomePublicClass.myPublicStaticFunc(anyInt()), times(1));` (6认同)