簡體   English   中英

莫基托; 模擬調用 lambda 的方法,並驗證該 lambda 調用的另一個模擬

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

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