[英]Save information that was spied by Mockito
我有一個JUnit測試為:
@Spy
ParallelSender parallelSender = new ParallelSender();
@Test
public void send() {
// making some data...
parallelSender.send(someData);
// check that internal method has been called with Sender Task made from someData
verify(parallelSender).doSend(any(SenderTask.class));
}
但是,我想檢查一下SenderTask是否完全包含了我需要的所有字段。 我可以告訴間諜攔截doSend調用,將其參數存儲在某個數組中,然后繼續使用實數方法嗎?
您可以使用ArgumentCaptor
。
@Captor
ArgumentCaptor<SenderTask> captor;
// or ArgumentCaptor<SenderTask> captor =
// ArgumentCaptor.forClass(SenderTask.class);
@Test public void send() {
// ...
verify(parallelSender).doSend(captor.capture());
SenderTask captured = captor.getValue();
使用ArgumentCaptor
:
@Test
public void send() {
// making some data...
parallelSender.send(someData);
// Define the captor for class
ArgumentCaptor<SenderTask> captor =
ArgumentCaptor.forClass(SenderTask.class);
// Capture input while verifying
verify(parallelSender).doSend(captor.capture());
// Assert
SomeTask result = captor.getValue();
// assertions on result
}
我很少使用參數捕獲器,因為通常沒有必要。 做這個
@Test
public void send() {
//given
SomeData myInput = ...
SenderTask expectedOutput = new SenderTask();
expectedOutput.setSomeField(/*expected field value*/);
//when
parallelSender.send(myInput);
//then
verify(parallelSender).doSend(expectedOutput);
}
背后的想法是檢查是否用預期對象調用了“ doSend”。
注意:只需確保您在SenderTask中實現了equals / hash方法-否則將無法正常工作
注意2:我建議避免在單元測試中使用any()。 通常,當您對某項進行單元測試時,您希望盡可能地精確。 因此,在結果驗證期間使用具體對象。
希望能有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.