日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

带有Java 8,lambda表达式和Mockito-Java8附加组件的更紧凑的Mockito

發布時間:2023/12/3 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 带有Java 8,lambda表达式和Mockito-Java8附加组件的更紧凑的Mockito 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mockito-Java8是一組Mockito附加組件,它們利用Java 8和lambda表達式使Mockito的模擬更加緊湊。

在2015年初,我進行了簡短的演講, Java 8為測試帶來了力量! 我在GeeCON TDD 2015和DevConf.cz 2015上發表了演講。在我使用4個示例的演講中,我展示了Java 8(即lambda表達式)如何簡化測試工具和總體上的測試。 這些工具之一就是Mokcito。 為了不讓我的PoC代碼死在幻燈片上并使之簡單地供他人使用,我發布了一個小項目,其中有兩個在特定情況下非常有用的Mockito Java 8附加組件。

快速介紹

作為前提,我們假設我們具有以下數據結構:

@Immutable class ShipSearchCriteria {int minimumRange;int numberOfPhasers; }

該庫提供了兩個附加組件:

Lambda匹配器 –允許在lambda表達式中定義匹配器邏輯。

given(ts.findNumberOfShipsInRangeByCriteria(argLambda(sc -> sc.getMinimumRange() > 1000))).willReturn(4);

ArgumentCaptor – Java 8版本 –允許在一行中使用ArgumentCaptor (此處與AssertJ一起使用):

verify(ts).findNumberOfShipsInRangeByCriteria(assertArg(sc -> assertThat(sc.getMinimumRange()).isLessThan(2000)));

Lambda匹配器

借助靜態方法argLambda將創建一個lambda匹配器實例,該實例可用于在lambda表達式(此處用于存根)中定義匹配器邏輯。 當使用復雜的類作為參數傳遞時,它可能特別有用。

@Test public void shouldAllowToUseLambdaInStubbing() {//givengiven(ts.findNumberOfShipsInRangeByCriteria(argLambda(sc -> sc.getMinimumRange() > 1000))).willReturn(4);//expectassertThat(ts.findNumberOfShipsInRangeByCriteria(new ShipSearchCriteria(1500, 2))).isEqualTo(4);//expectassertThat(ts.findNumberOfShipsInRangeByCriteria(new ShipSearchCriteria(700, 2))).isEqualTo(0); }

相比之下,使用Java 7中的自定義Answer實現的邏輯相同:

@Test public void stubbingWithCustomAsnwerShouldBeLonger() { //old way//givengiven(ts.findNumberOfShipsInRangeByCriteria(any())).willAnswer(new Answer<Integer>() {@Overridepublic Integer answer(InvocationOnMock invocation) throws Throwable {Object[] args = invocation.getArguments();ShipSearchCriteria criteria = (ShipSearchCriteria) args[0];if (criteria.getMinimumRange() > 1000) {return 4;} else {return 0;}}});//expectassertThat(ts.findNumberOfShipsInRangeByCriteria(new ShipSearchCriteria(1500, 2))).isEqualTo(4);//expectassertThat(ts.findNumberOfShipsInRangeByCriteria(new ShipSearchCriteria(700, 2))).isEqualTo(0); }

甚至Java 8和可讀性較差的構造也無濟于事:

@Test public void stubbingWithCustomAsnwerShouldBeLongerEvenAsLambda() { //old way//givengiven(ts.findNumberOfShipsInRangeByCriteria(any())).willAnswer(invocation -> {ShipSearchCriteria criteria = (ShipSearchCriteria) invocation.getArguments()[0];return criteria.getMinimumRange() > 1000 ? 4 : 0;});//expectassertThat(ts.findNumberOfShipsInRangeByCriteria(new ShipSearchCriteria(1500, 2))).isEqualTo(4);//expectassertThat(ts.findNumberOfShipsInRangeByCriteria(new ShipSearchCriteria(700, 2))).isEqualTo(0); }

Argument Captor – Java 8版本

靜態方法assertArg創建一個參數匹配器,該實現器內部使用ArgumentMatcher并在lambda表達式中提供一個斷言。 下面的示例使用AssertJ提供有意義的錯誤消息,但是可以使用任何斷言(例如來自TestNG或JUnit的本地聲明)(如果確實需要)。 這允許內聯ArgumentCaptor:

@Test public void shouldAllowToUseAssertionInLambda() {//whents.findNumberOfShipsInRangeByCriteria(searchCriteria);//thenverify(ts).findNumberOfShipsInRangeByCriteria(assertArg(sc -> assertThat(sc.getMinimumRange()).isLessThan(2000))); }

與經典方式的3行相比:

@Test public void shouldAllowToUseArgumentCaptorInClassicWay() { //old way//whents.findNumberOfShipsInRangeByCriteria(searchCriteria);//thenArgumentCaptor<ShipSearchCriteria> captor = ArgumentCaptor.forClass(ShipSearchCriteria.class);verify(ts).findNumberOfShipsInRangeByCriteria(captor.capture());assertThat(captor.getValue().getMinimumRange()).isLessThan(2000); }

摘要

所呈現的附加組件是作為我的會議演講的PoC創建的,但是應具有完全的功能,并在特定情況下可能有用。 要在您的項目中使用它,只需使用Mockito 1.10.x或2.0.x-beta,將mockito-java8作為依賴項添加mockito-java8 ,并且當然可以使用Java 8+編譯您的項目。

  • 可在項目網頁上找到更多詳細信息: https : //github.com/szpak/mockito-java8

翻譯自: https://www.javacodegeeks.com/2015/07/more-compact-mockito-with-java-8-lambda-expressions-and-mockito-java8-add-ons.html

總結

以上是生活随笔為你收集整理的带有Java 8,lambda表达式和Mockito-Java8附加组件的更紧凑的Mockito的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。