我在这里尽量避免使用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)));例外:
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编辑:请注意,我正在模拟一个既是静态的又是空的方法。
发布于 2020-09-11 12:53:23
当被模仿的方法被调用时,你希望发生什么?
默认行为是什么都不发生。通过调用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中指出的那样,即使你覆盖了默认行为,实际的方法仍然会被调用!这可能会在将来修复;请参阅Marc的答案以获得一些好的参考
发布于 2021-02-19 16:28:33
将@RunWith(PowerMockRunner.class)添加到您的类头将防止抛出上述异常类型!
https://stackoverflow.com/questions/63834381
复制相似问题