带有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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿联酋的科技野心:AI或将成为新“石油”
- 下一篇: 红底黄字门头风水好吗 红底黄字的招牌有问