如何通过在基于Java 8的项目中删除静态导入来简化Mockito的使用。
基本原理
Mockito API基于(BDD)Mockito类中聚集的静态方法(大部分),然后进行非常流畅的链接方法调用。 可以使用模拟/间谍/给定/然后/验证静态方法启动模拟创建,存根和呼叫验证:
@Test
public void shouldVerifyMethodExecution() {//givenTacticalStation tsSpy = BDDMockito.spy(TacticalStation.class);BDDMockito.willDoNothing().given(tsSpy).fireTorpedo(2);//whentsSpy.fireTorpedo(2);tsSpy.fireTorpedo(2);//thenBDDMockito.then(tsSpy).should(BDDMockito.times(2)).fireTorpedo(2);
}
非常冗长,但是从Java 5开始,可以使用静态导入来简化代码,但是要付出额外的静态导入的代价:
import static org.mockito.BDDMockito.then;
import static org.mockito.BDDMockito.willDoNothing;
import static org.mockito.BDDMockito.spy;
import static org.mockito.BDDMockito.times;
(...)@Test
public void shouldVerifyMethodExecution() {//givenTacticalStation tsSpy = spy(TacticalStation.class);willDoNothing().given(tsSpy).fireTorpedo(2);//whentsSpy.fireTorpedo(2);tsSpy.fireTorpedo(2);//thenthen(tsSpy).should(times(2)).fireTorpedo(2);
}
导入可以隐藏在IDE中,通常不会造成太大影响。 然而,为了能够只写一个没有类的方法名(例如, mock(TacticalStation.class)
),还是需要按ALT-ENTER(在IntelliJ IDEA中),以便在第一次使用给定方法时添加每个静态导入。测试课。 在Eclipse中情况更糟,在Eclipse中, 需要更早地将BDDMockito
添加到“ Content Assist”中的“ Favorites”中,以使其由IDE建议。 Eclipse的人可能会说“您必须做一次”,但是正如我在测试/ TDD培训中所经历的那样,它使Mockito的学习(使用)曲线变得更加陡峭。
当然,有一些技巧,例如默认情况下对Mockito类使用星号导入以减少所需的击键次数,但是如果您在项目中使用Java 8(希望是您的大多数),则有一种更简单的方法来应对它。
静态无进口方式
Mockito-Java8 2.0.0(及其对应的Mockito 1.10.x –版本1.0.0)引入了一组接口,这些接口提供了Mockito API的所有方法。 通过在测试类中“实现”它们,所有这些方法都可以在书面测试中自动直接访问:
//no static imports needed!public class SpaceShipTest implements WithBDDMockito {@Testpublic void shouldVerifyMethodExecution() {//givenTacticalStation tsSpy = spy(TacticalStation.class);willDoNothing().given(tsSpy).fireTorpedo(2);//whentsSpy.fireTorpedo(2);tsSpy.fireTorpedo(2);//thenthen(tsSpy).should(times(2)).fireTorpedo(2);}
}
该代码看起来与上一片段完全相同,但是不需要执行任何静态导入(除了WithBDDMockito本身的常规导入之外)。
在WithBDDMockito
接口实现非常简单。 所有方法都是默认方法,它们仅委托给BDDMockito
类中的适当静态方法。
default <T> BDDMockito.BDDMyOngoingStubbing<T> given(T methodCall) {return BDDMockito.given(methodCall);
}
Mockito的味道
Mockito方法由3个基本接口提供,它们是给定方法集的入口点:
-
WithBDDMockito
– BDD样式的存根/WithBDDMockito
API(还提供经典API)。 -
WithMockito
–经典的存根/WithMockito
API -
WithAdditionalMatchers
–其他Mokcito匹配器(基本帐户包含在With(BDD)Mockito中)
摘要
Java 8为如何以更紧凑和可读的方式编写(测试)代码开辟了新的机遇。 静态导入的免费Mockito代码可以稍微简化编写测试,但是Mockito-Java8中已经提供了更多功能,Mockito 3.0中甚至包含了更多功能(必须以非向后兼容的方式修改Mokcito内部的功能) 。 过多地了解如何重构代码/项目以从Java 8中受益,您可以看到我的简短演示“ Java 8为测试带来了力量!” ( 幻灯片和视频 )。
Mockito-Java8 2.0.0-beta(适用于Mockito> = 2.0.22-beta)和1.0.0-beta(适用于Mockito 1.10.x和Mockito 2的早期beta)可通过Maven Central获得 。 这些版本应该相当稳定,但是我希望获得有关此新功能的更多反馈,因此将其标记为Beta。 可以在项目网页上找到更多详细信息。
致谢 。 这个想法最初是David Gageot( Infinitest的幕后人物)在他的一篇博客文章中提出的 。
翻译自: https://www.javacodegeeks.com/2015/12/using-mockito-without-static-imports-java-8.html