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

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

mockito 静态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Mockito 进行单元测试时,Mockito 默认只能 Mock 非静态方法。但是,你仍然可以通过使用 PowerMock 或者 Mockito+MockitoExtension 来 Mock 静态方法。 下面是使用 PowerMock 的示例代码: 首先,你需要添加 PowerMock 和 Mockito 的依赖到你的项目。例如,如果你使用的是 Maven,可以在 pom.xml 添加以下依赖: ```xml <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> ``` 接下来,在你的测试类使用 `@RunWith` 注解来告诉 JUnit 使用 PowerMock 运行测试,并使用 `@PrepareForTest` 注解来指定需要 Mock 的类。然后,通过调用 `PowerMockito.mockStatic()` 方法来 Mock 静态方法。 ```java import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(YourClassWithStaticMethod.class) public class YourTestClass { @Test public void testYourMethod() { PowerMockito.mockStatic(YourClassWithStaticMethod.class); // 在这里编写你的测试逻辑 } } ``` 注意,`YourClassWithStaticMethod` 是你想要 Mock 的含有静态方法的类。 希望这个示例对你有帮助!如果你有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值