带有 Java 8 和 Lambda 表达式的更紧凑的 Mockito

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观

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;
}


和一个我们想要存根/模拟的类:


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


该库提供了两个附加组件:

Lambda 匹配器 - 允许在 lambda 表达式中定义匹配器逻辑。


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


Argument Captor - Java 8 版 - 允许在一行中使用“ArgumentCaptor”(此处使用 AssertJ):


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


Lambda匹配器

在静态方法 argLambda 的帮助下,创建了一个 lambda 匹配器实例,该实例可用于在 lambda 表达式中定义匹配器逻辑(此处用于存根)。当使用复杂的类作为参数传递时,它可能特别有用。


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


相比之下,在 Java 7 中使用自定义 Answer 实现的相同逻辑:


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


即使是 Java 8 和可读性较差的结构也无济于事:


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


Argument Captor - Java 8 版

静态方法 assertArg 创建一个参数匹配器,其实现在内部使用 ArgumentMatcher 和 lambda 表达式中提供的断言。下面的示例使用 AssertJ 来提供有意义的错误消息,但可以使用任何断言(如来自 TestNG 或 JUnit 的本机断言)(如果确实需要)。这允许具有内联的 ArgumentCaptor:


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


与经典方式的 3 行相比:


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


概括

提供的附加组件是为我的会议演讲创建的 PoC,但应该功能齐全并且在特定情况下可能有用。要在您的项目中使用它,使用 Mockito 1.10.x 或 2.0.x-beta 就足够了,添加“mockito-java8”作为依赖项,当然还可以使用 Java 8+ 编译您的项目。

项目网页上提供了更多详细信息: https://github.com/szpak/mockito-java8