Mockito.verify(Object,VerificationMode.atleast(2))时出现NoAMockException

Ram*_*esh 8 java testng mockito junit-ee

我使用mockito来模拟单元测试用例并得到以下异常

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type ConsumerImpl and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMetenter code herehod();
Run Code Online (Sandbox Code Playgroud)

我的代码是

 MessageConsumer mConsumer = Mockito.mock(MessageConsumer.class);
            String data = "new Message for Testing";
            Message message = new Message(data.getBytes());
            Mockito.when(mConsumer.next(10, TimeUnit.SECONDS)).thenReturn(message);
            StringParserTest parserTest = new StringParserTest();
            ConsumerImpl<String> consumer = new ConsumerImpl<String>(mConsumer, parserTest);
            String mes=Mockito.verify(consumer,VerificationModeFactory.times(3)).consumeMessage(10,TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

请有人帮我解决这个问题

提前致谢

SRN

Bri*_*ice 5

好吧,这正是 mockito 所说的,您没有通过模拟来验证!

ConsumerImpl<String> consumer = new ConsumerImpl<String>(mConsumer, parserTest);
String mes=Mockito.verify(consumer,VerificationModeFactory.times(3)).consumeMessage(10,TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

另外,如果您验证了一个模拟,为什么要存储您验证的调用的结果,因为消费者被模拟了,所以没有意义。验证是验证对作为单元测试对象协作者的模拟对象的调用。在你的情况下,这不是很清楚。

你也从不使用你的模拟mConsumer实例。

您绝对应该将测试分为 3 个阶段,一个用于夹具,一个用于操作,一个用于验证。使用 BDD 术语来实现这一点,它增强了测试人员和此代码未来读者的理解和可读性(并且 Mockito 通过 BDDMockito 在 API 中提供它们)。

由于我并没有真正从您提供的代码中获得代码试图测试的内容,因此我将进行想象。例如,您将编写这种代码(使用import static):

// given a consumer
MessageConsumer message_consumer = mock(MessageConsumer.class);
String the_message_data = "new Message for Testing";
given(message_consumer.next(10, SECONDS)).willReturn(new Message(the_message_data.getBytes()));

// when calling the client of the customer (which is the unit that is tested)
new MessageProcessor(message_consumer).processAll();

// then verify that consumeMessage is called 3 times
verify(message_consumer, times(3)).consumeMessage(10, SECONDS);
Run Code Online (Sandbox Code Playgroud)

请记住,Mockito 可帮助您专注于对象之间的交互——因为它是面向对象编程中最重要的概念——尤其是在被测试者和他的合作者之间,他们肯定会被嘲笑。