我试图以下面的方式模拟spring的applicationContext.getBean(String,Class)方法 -
when(applicationContext.getBean(Mockito.anyString(), Mockito.eq(SomeClass.class))).thenAnswer(
new Answer<SomeClass>() {
@Override
public SomeClass answer(InvocationOnMock invocation) throws Throwable {
// doing some stuff and returning the object of SomeClass
}
});
方案是,applicationContext.getBean方法将被调用多次,每次使用不同的字符串但是同一个类(SomeClass.class)。
我遇到的问题是,第一次调用getBean方法时会调用答案。随后每次调用getBean,我都会遇到异常 -
******org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));******
任何想法,如果我遗失了什么?
答案 0 :(得分:0)
使用Mockito时,你需要告诉他你有多少次会打电话给你的模拟器。您需要根据需要进行尽可能多的when
次呼叫。例如,如果您知道自己将对方法进行三次测试,则需要声明三个单独的when
语句。
PS:我只使用了Mockito,有可能有一个解决方案告诉Mockito连续多次使用相同的Answer
。
修改强>
Olivier Grégoire在评论中指出,您可以使用一次when
来电,但多次致电thenAnswer
。这种方式更优雅。
答案 1 :(得分:0)
@Kshitij
我在之前的项目中遇到过同样的问题。我在下面的文档中遇到过: http://static.javadoc.io/org.mockito/mockito-core/2.16.0/org/mockito/Mockito.html#resetting_mocks
在第17节中,解释了如何使用reset()
示例:假设我们使用EvenOddService来查找数字是偶数还是奇数,然后使用reset()的测试用例如下所示:
when(evenOddService.isEven(20)).thenReturn(true);
Assert.assertEquals(evenOddController.isEven(20), true);
//allows to reuse the mock
reset(evenOddService);
Assert.assertEquals(evenOddController.isEven(20), true);
希望这会有所帮助:)。
答案 2 :(得分:0)
我已将其添加到我的测试班:
@AfterEach
public void resetMock(){
Mockito.reset(myMockedService);
}