亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模擬; 模擬調用 lambda 的方法,并驗證該 lambda 調用的另一個模擬

模擬; 模擬調用 lambda 的方法,并驗證該 lambda 調用的另一個模擬

鴻蒙傳說 2022-06-30 17:37:24
我仍然需要一段時間才能弄清楚:如何驗證在傳遞給另一個模擬對象的方法的 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 的原始 3rd 方庫方法的處理類似于上面引用的問題中給出的答案,但有一些調整: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));  })
查看完整描述

2 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

我正在嘗試做一些非常類似的事情,以驗證從withHandle測試中的模擬 JDBI 調用傳遞給另一個模擬的參數。


您在問題中給出的答案為我指明了正確的方向,但給了我錯誤消息:


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. (在這個測試中返回的實際結果并不重要,只是將預期的參數傳遞給我隨后的模擬對象)。


我還將verify調用移到了Answer測試的主體中,因此更清楚的是這是測試的預期,而不是模擬設置的一部分。


查看完整回答
反對 回復 2022-06-30
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

看到這個問題,上面應該充分回答;)



查看完整回答
反對 回復 2022-06-30
  • 2 回答
  • 0 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號