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

Java 如何验证公共类';使用mockito调用的静态方法?,java,mockito,Java,Mockito,伪代码是这样的 rc = SomePublicClass.myPublicStaticFunc(arg) public class SomePublicClass { private SomePublicClass() { } public static int myPublicStaticFunc(arg) { return 5; } } 在UT中,这不起作用 verify(SomePublicClass, times(1)). myPu

伪代码是这样的

rc = SomePublicClass.myPublicStaticFunc(arg)


public class SomePublicClass {
    private SomePublicClass() {
    }

    public static int myPublicStaticFunc(arg) {
        return 5;
    }
}
在UT中,这不起作用

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

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

自从Mockito 3.4以来,模拟静态方法就可用了

请参阅拉动请求:

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

尽管如此:

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

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())
    );
}
try(MockedStatic dummystic=Mockito.mockStatic(SomePublicClass.class)){
当(SomePublicClass::myPublicStaticFunc)
.然后返回(5);
//什么时候
System.out.println(SomePublicClass.myPublicStaticFunc());
//然后
dummyStatic.verify(
次(1),,
SomePublicClass::myPublicStaticFunc
);
}
静态方法接受参数时进行测试:

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())
    );
}
try(MockedStatic dummystic=Mockito.mockStatic(SomePublicClass.class)){
dummyStatic.when(()->SomePublicClass.myPublicStaticFunc(anyInt()))
.然后返回(5);
//什么时候
System.out.println(SomePublicClass.myPublicStaticFunc(7));
//然后
dummyStatic.verify(
次(1),,
()->SomePublicClass.myPublicStaticFunc(anyInt())
);
}

自Mockito 3.4以来,就可以使用模拟静态方法

请参阅拉动请求:

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

尽管如此:

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

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())
    );
}
try(MockedStatic dummystic=Mockito.mockStatic(SomePublicClass.class)){
当(SomePublicClass::myPublicStaticFunc)
.然后返回(5);
//什么时候
System.out.println(SomePublicClass.myPublicStaticFunc());
//然后
dummyStatic.verify(
次(1),,
SomePublicClass::myPublicStaticFunc
);
}
静态方法接受参数时进行测试:

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())
    );
}
try(MockedStatic dummystic=Mockito.mockStatic(SomePublicClass.class)){
dummyStatic.when(()->SomePublicClass.myPublicStaticFunc(anyInt()))
.然后返回(5);
//什么时候
System.out.println(SomePublicClass.myPublicStaticFunc(7));
//然后
dummyStatic.verify(
次(1),,
()->SomePublicClass.myPublicStaticFunc(anyInt())
);
}

我不太明白你的问题,你到底想做什么?这对你有帮助吗?不是,要使用mockito,首先需要模拟对象。在我的例子中,它是一个静态方法。那么您需要的是使用PowerMock,也许类似这样的东西?我不太明白你的问题,你到底想做什么?这对你有帮助吗?不是,要使用mockito,首先需要模拟对象。在我的例子中,它是一个静态方法。那么您需要的是使用PowerMock,也许类似这样的东西?