记录期望的结果
将调用与特定实例匹配
可注入的模拟实例
声明多个模拟实例
使用给定构造函数创建的实例
参数值的灵活匹配
使用“任何”字段进行参数匹配
使用“with”方法进行参数匹配
使用null值匹配任意对象引用
匹配值通过一个可变参数参数传递
指定调用计数约束
显式验证
验证调用从未发生
验证按顺序
部分有序验证
完全验证
按顺序完全验证
限制要完全验证的模拟类型集
验证是否未发生调用
验证不应发生的未指定调用
捕获调用参数以进行验证从单个调用捕获参数
从多个调用捕获参数
捕获新实例
代理:指定自定义结果
级联模拟级联静态工厂方法
级联自返回法
部分嘲笑
捕获实现类和实例模拟未指定的实现类
对于未来实例指定行为
在JMockit库, Expectations(期望)API提供了使用自动化的开发人员测试mock的丰富的支持。 当mock使用,在测试的重点是代码的被测行为,如通过其与其他类型它取决于相互作用表达。 嘲笑通常以分离的单元测试的结构,其中,受测试的单元中隔离行使从其它单元的执行它取决于使用。 通常,行为的单位体现在单个类中,但也可以考虑一整套强相关的类作为单个单元用于单元测试的目的(通常情况下,当我们有一个中央公共类与一个或多个帮助类,可能package-private); 一般来说,个别方法不应被视为独立的单位。
严格的单元测试,但是,这不是一个推荐的方法; 一个单元测试不应该试图Mock每一个依赖。 mock最好使用适度; Mock偶尔也有用于创建集成测试,一些特定的依赖关系不实现容易使用,或当试图创建测试的复杂依赖的情况下,一个良好的Mock,可以大大方便测试。
两个类之间的相互依赖总是通过一个方法或构造函数调用的形式。 从被测试类到其依赖的调用集合以及它们之间传递的参数和返回值定义了该特定类的测试感兴趣的行为。 此外,给定的测试可能需要验证多次调用之间的执行的相对顺序。
Mock类型和实例
从依赖的测试代码调用的方法和构造函数是Mock的目标。 Mocking提供了我们需要的机制,以便将被测试的代码与(一些)依赖关系隔离开来。 我们指定特定的依赖关系是通过声明适当的模拟域和/或模拟参数被嘲笑为一个给定的测试(或测试); mock字段声明为测试类的注释实例字段,而mock参数声明为测试方法的注释参数。 要模拟的依赖关系的类型将是模拟字段或参数的类型。 这样的类型可以是任何类型的引用类型的:interface,class(包括abstract和final的),注释,或enum。
默认情况下, 所有非private (即是包括任何方法static , final ,还是native )的Mock对象的将被Mock为测试的持续时间。 如果声明Mocked的是一个类,它所有的超类的,但不包括java.lang.Object,都将被Mocked, 因此,继承的方法也会自动被Mock。 另外一种的情况下,所有的非的private
构造函数将被Mock。
当一个方法或构造器被Mock时,在测试期间发生的调用在它的原始实现代码中将不会被执行。 相反,调用将被重定向到JMockit,所以它可以以显式或隐式指定的测试方式处理。
以下示例测试框架用作对mock字段和mock参数的声明以及它们在测试代码中通常使用的方式的基本说明。 在本博客中,我们使用了很多这样的代码片段,其中粗体字的部分是当前的重点解释。
// "Dependency" is mocked for all tests in this test class.
// The "mockInstance" field holds a mocked instance automatically created for use in each test.
@Mocked Dependency mockInstance ;
@Test
public void doBusinessOperationXyz(@Mocked final AnotherDependency anotherMock ) {
...
new Expectations() {{
// an "expectation block" ...
// Record an expectation, with a given value to be returned:
mockInstance .mockedMethod(...);
result = 123; ... }}; ...
// Call the code under test. ...
new Verifications() {{
// a "verification block"
// Verifies an expected invocation:
anotherMock .save(any); times = 1; }}; ... }
对于在测试方法中声明的mock参数,声明类型的实例将由JMockit自动创建,并在JUnit / TestNG测试运行器执行测试方法时传递; 因此,参数值将永远不会null。 对于模拟领域,只要它不是final,声明类型的实例会自动JMockit创建并分配到领域中。
有一些不同的注释可用于声明模拟字段和参数,以及默认模拟行为可以修改以适应特定测试的需要的方式。 本章的其他部分细谈,但基本是: @Mocked是中央嘲讽注解,有一个可选的属性,它是在某些情况下非常有用; @Injectable是另一种嘲弄的注释,从而限制了讥诮的实例方法单个模拟实例; 和@Capturing又是一个标注讥诮,延伸到嘲讽类实现嘲笑接口,或扩展嘲笑类的子类。 当@Injectable或@Capturing被施加到模拟域或模拟参数, @Mocked是隐含的,因此不需要(但是可以)被施加为好。
由JMockit创建的模拟实例可以在测试代码(用于期望的记录和验证)中正常使用,和/或传递到测试中的代码。 或者他们可能只是闲置。 不同于其他嘲笑的API,这些嘲笑对象不必是被测的代码中使用的那些时,它调用其依赖实例方法。默认情况下(例如,当@Injectable不使用),JMockit并不关心其上一个对象实例嘲笑方法被调用。 这使得在测试中直接创建内部代码实例的透明嘲讽,当上述代码调用使用全新的实例构造new
运营商; 实例化的类必须由测试代码中声明的模拟类型覆盖,这就是全部。
网友评论