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