java - 如何验证使用 mockito 调用公共(public)类的静态方法?

标签 java mockito

伪代码是这样的

rc = SomePublicClass.myPublicStaticFunc(arg)


public class SomePublicClass {
    private SomePublicClass() {
    }

    public static int myPublicStaticFunc(arg) {
        return 5;
    }
}
在 UT 这不起作用
verify(SomePublicClass, times(1)). myPublicStaticFunc();
由于这是一个公共(public)类,如何验证 myFunc 在单元测试中的 mockito 中被调用?如果 SomePublicClass 是一个模拟类,这可以工作。

最佳答案

自 Mockito 3.4 起,可以使用模拟静态方法。
查看拉取请求:Mockito #1013: Defines and implements API for static mocking.
请注意,此功能可用的事实并不等同于建议使用它。它针对无法重构源代码的遗留应用程序。
话说回来:
测试静态方法何时不带参数:

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
    );
}
测试静态方法何时接受参数:
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())
    );
}

关于java - 如何验证使用 mockito 调用公共(public)类的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63006056/

相关文章:

java - 在 MouseWheelMotion 事件期间窗口变为空白

java - 从所有 Activity/类中删除一行代码

java - 基于XPath DOM修改XML内容

java - Mockito 不能模拟这个类

java - 模拟对象返回 null

java - 如何在谷歌数据流中创建个性化WindowFn

java - 写入文件问题

java - 了解 Mockito 验证背后的语义

java - JUnit Mockito 测试 : zero interactions

java - 如何模拟 Dao 两次但使用同一个对象调用?