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

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

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