簡體   English   中英

NotAMockException 而 Mockito.verify(Object,VerificationMode.atleast(2))

[英]NotAMockException while Mockito.verify(Object,VerificationMode.atleast(2))

我正在使用 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

好吧,這正是 mockito 所說的,您沒有通過模擬來驗證!

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

另外,如果您驗證了一個模擬,為什么要存儲您驗證的調用的結果,因為消費者被模擬了,所以沒有意義。 驗證是驗證對作為單元測試對象協作者的模擬對象的調用。 在你的情況下,這不是很清楚。

此外,您從不使用模擬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 可幫助您專注於對象之間的交互——因為它是面向對象編程中最重要的概念——尤其是在被測試者和他的合作者之間,他們肯定會被嘲笑。

通常我們使用@InjectMock 進行模擬,並嘗試驗證從測試用例方法內部調用的方法。 這是一種通常會產生問題的場景。

public class A{
  @Autowired
  Service s

  public void method1(){
    method2();
  }
  public void method2(){
    s.someMethod();
  }
}

public class ATest{

  @InjectMocks
  A a;

  public void testM1(){
    a.method1();
    Mockito.verify(a, Mockito.times(1)).method2();

  }
}

這將始終給出“NoAMockException while Mockito.verify”,而不是我們應該使用以下驗證。

public class ATest{
  @InjectMocks
  A a;
  @Mock
  Service s

  public void testM1(){
    a.method1();
    Mockito.verify(s, Mockito.times(1)).someMethod();
  }
}

或者如果我們想要 verify() method2() 那么我們必須@Mock class A 而不是@InjectMock

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM