![](/img/trans.png)
[英]Mockito verify that a specific lambda has been passed as an argument in mock's method
[英]Mockito; Mock a method that calls a lambda, and verify another mock called by that lambda
我的問題與此類似:
使用模擬; 是否可以模擬一個將 lambda 作為參數並斷言由 lambda 捕獲的變量的方法?
但不同的是,我仍然需要一段時間才能弄清楚:
如何驗證在傳遞給另一個模擬對象的方法的 lambda 中使用的模擬調用的方法?
這可能看起來很復雜,但在 Java 8 庫(如 JDBI)中經常發生這種情況,例如,您有一個 JDBI 對象:
JDBI MyDBConnection
你應該嘲笑。 然后與 withHandle 方法一起使用來傳遞一個實現 HandleCallback<R,X> 類型的 lambda:
//code I'm testing. I implement the lambda, and want to verify it
//calls the correct method in dao provided by JDBI.
MyDBConnection.withHandle(
(handle) -> { ... handle.attach(SomeDao.class).findSomethingInDB(args) .. }
這是執行此操作的推薦方法。
所以我想驗證 findSomethingInDB(eq(args)) 是否被調用。
就像我說的那樣,這很相似,但又足夠不同,以至於我至少會在未來某個時候發現這個答案很有價值,當我忘記如何做到這一點時。 因此,調用我的 lambda 的原始第 3 方庫方法的處理類似於上面引用的問題中給出的答案,但有一些調整:
when(JDBIMock.withHandle(any())).then(
//Answer<Void> lambda
invocationOnMock -> {
Object[] args = invocationOnMock.getArguments();
assertEquals(1, args.length);
//the interface def for the callback passed to JDBI
HandleCallback lambda = (HandleCallback) args[0];
when(mockHandle.attach(SomeDao.class)).thenReturn(mockDao);
//this actually invokes my lambda, which implements the JDBI interface, with a mock argument
lambda.withHandle(mockHandle);
//bingo!
verify(mockDao).findSomethingInDB(eq(args));
}
)
看到這個問題,上面應該有足夠的回答;)
我正在嘗試做一些非常相似的事情, withHandle
在測試中的模擬 JDBI 調用上驗證從withHandle
傳遞給另一個模擬的參數。
您在問題中給出的答案指出了正確的方向,但給了我錯誤消息:
The method then(Answer<?>) in the type OngoingStubbing<Object> is not applicable for the arguments ((<no type> invocationOnMock) -> {})
相反,我不得不使用一個新的org.mockito.stubbing.Answer
傳遞給then
,類似於您鏈接到的另一個問題。
在您的示例中,這將類似於:
when(JDBIMock.withHandle(any())).then(
//Answer<Void> lambda
new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
assertEquals(1, args.length);
//the interface def for the callback passed to JDBI
HandleCallback lambda = (HandleCallback) args[0];
when(mockHandle.attach(SomeDao.class)).thenReturn(mockDao);
//this actually invokes my lambda, which implements the JDBI interface, with a mock argument
lambda.withHandle(mockHandle);
//bingo!
verify(mockDao).findSomethingInDB(eq(args));
return null; // to match the Void type
}
}
)
在我的情況下,我期待來自withHandle
的結果列表,所以我不得不更改Answer
類型,並返回answer
類型以匹配並返回一個虛擬列表而不是Void
。 (返回的實際結果在此測試中無關緊要,只是將預期的參數傳遞給我隨后的模擬對象) 。
我還將Answer
之外的verify
調用移到了我的測試主體中,因此更清楚這是測試的期望,而不是模擬設置的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.