在Java 8中使用不带静态导入的Mockito

如何通过在基于Java 8的项目中删除静态导入来简化Mockito的使用。

基本原理

Mockito API基于(BDD)Mockito类中聚集的静态方法(大部分),然后进行非常流畅的链接方法调用。 可以使用模拟/间谍/给定/然后/验证静态方法启动模拟创建,存根和呼叫验证:

@Test
public void shouldVerifyMethodExecution() {
    //given
    TacticalStation tsSpy = BDDMockito.spy(TacticalStation.class);
    BDDMockito.willDoNothing().given(tsSpy).fireTorpedo(2);
    //when
    tsSpy.fireTorpedo(2);
    tsSpy.fireTorpedo(2);
    //then
    BDDMockito.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() {
    //given
    TacticalStation tsSpy = spy(TacticalStation.class);
    willDoNothing().given(tsSpy).fireTorpedo(2);
    //when
    tsSpy.fireTorpedo(2);
    tsSpy.fireTorpedo(2);
    //then
    then(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 {

    @Test
    public void shouldVerifyMethodExecution() {
        //given
        TacticalStation tsSpy = spy(TacticalStation.class);
        willDoNothing().given(tsSpy).fireTorpedo(2);
        //when
        tsSpy.fireTorpedo(2);
        tsSpy.fireTorpedo(2);
        //then
        then(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值