[英]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.