使用 Mockito 验证静态方法调用

问题描述 投票:0回答:2

我试图在测试中验证是否调用了静态方法。我正在使用 Mockito 来实现此目的。

这个问题与this类似。但是,最高票数回复中建议的解决方案不再适用,因为 MockedStatic 验证方法已被弃用。

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

另一种方法是致电

verify(dummyStatic).myPublicStaticFunc(anyInt);

但是,它抱怨该类型的方法 myPublicStaticFunc(int) 未定义 模拟静态。

我有什么选择,或者我错过了什么。另外,我知道我可以使用 PowerMock 尝试此操作,但目前,我尝试仅使用 Mockito 来实现此操作。

java unit-testing testing mockito static-methods
2个回答
44
投票

似乎已弃用的是

void verify(VerificationMode mode, Verification verification)
void verify(Verification verification, VerificationMode mode)
仍然可以,所以你可以使用像
这样的 
verify

方法
dummyStatic.verify(
    () -> SomePublicClass.myPublicStaticFunc(anyInt()),
    times(1)
);

我使用了以下依赖项:

testImplementation "org.mockito:mockito-inline:3.12.1"

似乎使用

mockito-core
你将无法嘲笑这个,因为你会收到

使用的MockMaker子类ByteBuddyMockMaker不支持静态mock的创建


0
投票

这里有一个例子:

void shouldLogInfoAfterRecord() {

try (MockedStatic<LoggingHelper> loggingHelperMocked = mockStatic(LoggingHelper.class)) {
  kafkaInterceptor.afterRecord(consumerRecord, consumer);

  loggingHelperMocked.verify(LoggingHelper::clearContext, times(1));
}

}

注意:方法:clearContext 具有给定签名: public static voidclearContext() ,并且它在 kafkaInterceptor.afterRecord 内部执行。

© www.soinside.com 2019 - 2024. All rights reserved.