java - 是否可以使用 Mockito 模拟静态和无效的方法?

标签 java mockito

我试图避免在这里使用 PowerMockito。我们有遗留代码,其中包含静态和无效的方法,并且有需要模拟它们的测试。有没有办法做到这一点,或者重构遗留代码是这里的唯一方法?

class MySample {
       public static void sampleMethod(String argument){
                //do something
       }
}
如果我使用一般的 MockStatic 语法,它会要求我返回一些东西:
MockedStatic <MySample> sampleMock = Mockito.mockStatic( MySample.class );
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)));
异常(exception):
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at com.mytests.Test.setMock(Test.java:35)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, which is not supported
 3. you are stubbing the behaviour of another mock inside before 'thenReturn' instruction is completed
编辑:请注意,我正在寻找一种既静态又无效的方法。

最佳答案

当模拟方法被调用时,你想发生什么?
默认行为是什么都不发生。调用 sampleMock.when() ,您表示您想从默认行为更改为其他行为。 Mockito 正在提示,因为您随后没有通过调用 then___() 跟进此事。来指定应该发生什么。
我可以想到您可能希望发生的一些不同的事情:
1.什么都不做
如前所述,这是默认行为,所以如果这就是你想要的,你可以删除第二行,它应该可以工作。但是,如果你真的需要一个 when调用(例如用于参数捕获),您可以改为使用空 thenAnswer 结束该行:

sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenAnswer(invocation -> null);
2.调用真正的方法
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenCallRealMethod();
3. 做点别的
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenAnswer(invocation -> {
        // insert code to do something else here
        return null;
    });
4.抛出异常
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenThrow(RuntimeException.class);
更新
如前所述,默认行为是什么都不做,但我了解到也可以通过提供 Answer 来指定替代默认行为。创建模拟时。例如,要让默认行为改为调用真实方法:
MockedStatic <MySample> sampleMock = Mockito.mockStatic( MySample.class, Mockito.CALLS_REAL_METHODS );
但要注意 - 正如 Marc 在 this answer 中指出的那样,即使你覆盖了默认行为,真正的方法仍然会被调用!这可能会在 future 修复;请参阅 Marc 的回答以获取一些好的引用资料

关于java - 是否可以使用 Mockito 模拟静态和无效的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63834381/

相关文章:

java - Web 应用程序中的编程用户注册 Java Spring MVC

JavaFX 在 for 循环期间暂停而不使用 Thread.Sleep()

java - 配置 mockito 以在验证错误消息中打印实际参数值

java - Mockito-自定义匹配器在尝试匹配原始时抛出NPE

android - 如何/我应该使用 Mockito 对 EventBus 事件进行单元测试?

java - 使用 PowerMockito 在最终类中模拟私有(private)静态方法

java - 使用 Java 泛型错误

java - net.sf.jasperreports.engine.util.JRResourcesUtil.findClassLoaderResource(Ljava/lang/String;Ljava/lang/ClassLoader;)

java - 我如何在 2.7.x 中使用 Mockito.doReturn

java - 在 Mockito 中模拟 "marshalSendandReceive"方法调用时出现问题