Mockito答案只被调用一次

时间:2018-03-20 14:52:08

标签: java junit mockito

我试图以下面的方式模拟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"));******

任何想法,如果我遗失了什么?

3 个答案:

答案 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);
}