8

単体テストケースのモックに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();

そして私のコードは

 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);

この問題を解決するために誰か助けてください

前もって感謝します

SRN

4

2 に答える 2

5

まあ、それはまさに mockito が言うことです、あなたは verify にモックを渡していません!

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

さらに、モックを検証した場合、検証した呼び出しの結果を保存する理由は、消費者がモックされているため意味がありません。Verify は、単体テストされたオブジェクトの共同作業者であるモック オブジェクトの呼び出しを検証することです。あなたの場合、どれが本当に明確ではありません。

また、モック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);

Mockito は、オブジェクト間の相互作用 (オブジェクト指向プログラミングの最も重要な概念であるため) に焦点を当てるのに役立つことを忘れないでください。

于 2013-05-29T16:56:56.997 に答える