首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能用Mockito模拟一个既是静态的又是空的方法?

有没有可能用Mockito模拟一个既是静态的又是空的方法?
EN

Stack Overflow用户
提问于 2020-09-11 00:58:30
回答 2查看 1.3K关注 0票数 4

我在这里尽量避免使用PowerMockito。我们有遗留代码,其中包含既是静态的又是空的方法,还有需要模拟它们的测试。有没有办法做到这一点,或者重构遗留代码是唯一的方法?

代码语言:javascript
复制
class MySample {
       public static void sampleMethod(String argument){
                //do something
       }
}

如果我使用一般的MockStatic语法,它会要求我返回一些东西:

代码语言:javascript
复制
MockedStatic <MySample> sampleMock = Mockito.mockStatic( MySample.class );
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)));

例外:

代码语言:javascript
复制
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

编辑:请注意,我正在模拟一个既是静态的又是空的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-11 12:53:23

当被模仿的方法被调用时,你希望发生什么?

默认行为是什么都不发生。通过调用sampleMock.when(),您表明希望从默认行为更改为其他行为。Mockito抱怨是因为你没有随后调用then___()来指定应该发生的事情。

我可以想到一些你可能希望发生的不同的事情:

1.什么都不做

如前所述,这是默认行为,所以如果这是您想要的全部,您只需删除第二行,它就应该可以工作。但是,如果您确实需要使用when调用(例如,用于参数捕获),则可以使用空thenAnswer结束该行

代码语言:javascript
复制
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenAnswer(invocation -> null);

2.调用真正的方法

代码语言:javascript
复制
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenCallRealMethod();

3.做点别的

代码语言:javascript
复制
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenAnswer(invocation -> {
        // insert code to do something else here
        return null;
    });

4.抛出异常

代码语言:javascript
复制
sampleMock.when(() -> MySample.sampleMethod(Mockito.any(String.class)))
    .thenThrow(RuntimeException.class);

更新

如前所述,默认行为是不执行任何操作,但我了解到,也可以通过在创建模拟时提供Answer来指定替代默认行为。例如,要让默认行为改为调用实际方法:

代码语言:javascript
复制
MockedStatic <MySample> sampleMock = Mockito.mockStatic( MySample.class, Mockito.CALLS_REAL_METHODS );

但要注意--正如Marc在this answer中指出的那样,即使你覆盖了默认行为,实际的方法仍然会被调用!这可能会在将来修复;请参阅Marc的答案以获得一些好的参考

票数 1
EN

Stack Overflow用户

发布于 2021-02-19 16:28:33

@RunWith(PowerMockRunner.class)添加到您的类头将防止抛出上述异常类型!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63834381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档