简体   繁体   English

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

[英]How to verify a public class's static method get called using mockito?

The pseudo code is like this伪代码是这样的

rc = SomePublicClass.myPublicStaticFunc(arg)


public class SomePublicClass {
    private SomePublicClass() {
    }

    public static int myPublicStaticFunc(arg) {
        return 5;
    }
}

in UT this doesn't work在 UT 这不起作用

verify(SomePublicClass, times(1)). myPublicStaticFunc();

since this is a public class, how to verify myFunc gets called in mockito in unit test?由于这是一个公共 class,如何验证 myFunc 在单元测试中在 mockito 中被调用? If SomePublicClass were a mocked class, this can work.如果 SomePublicClass 是一个模拟的 class,这可以工作。

Mocking static methods is available since Mockito 3.4. Mocking static 方法自 Mockito 3.4 起可用。

See pull request: Mockito #1013: Defines and implements API for static mocking.请参阅拉取请求: Mockito #1013:为 static ZD1892D08020BA20CC1Z8378 定义和实现 API。

Please note that the fact that this feature is available is not equivalent with recommendation to use it.请注意,此功能可用的事实并不等同于使用它的建议。 It is aimed at legacy apps where you cannot refactor the source code.它针对无法重构源代码的遗留应用程序。

Having said that:话说回来:

Test when static method takes no arguments:测试 static 方法不采用 arguments 时:

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
    );
}

Test when static methods takes arguments:测试 static 方法采用 arguments 时:

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())
    );
}

Since Mockito-Inline 4.0 the order of parameters for verify has been reversed to match the other verification methods:Mockito-Inline 4.0以来,verify 的参数顺序已颠倒以匹配其他验证方法:

Test when static method takes no arguments:测试 static 方法不采用 arguments 时:

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

Test when static methods takes arguments:测试 static 方法采用 arguments 时:

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(
            () -> SomePublicClass.myPublicStaticFunc(anyInt()),
            times(1)
    );
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM