1.介绍

在本文中,我们将开始一个以mock工具包为中心的新系列jmockit.

在第一部分中,我们将讨论什么是JMockit、它的特征以及如何创建和使用模金宝搏官网188be拟。

后来的文章将专注于并进入其能力。

2. JMockit.

2.1。介绍

首先,让我们讨论一下JMockit是什么:一个用于金宝搏官网188be在测试中模拟对象的Java框架(您可以在这两种情况下都使用它JUnitTestNG那些)。

它使用Java的仪器API在运行时在运行时修改类的字节码,以便动态改变其行为。其一些强点是其表现性及其开箱即用的静态和私人方法。

也许你是jmockit的新手,但它绝对不是因为它是新的。JMockit的发展于2006年6月开始,其第一个稳定的发布日期至2012年12月,因此现在已经存在了一段时间(当前版本是在撰写文章时的1.24)。

2.2。maven依赖

首先,我们需要添加jmockit.对我们项目的依赖:

<依赖> < groupId > org。jmockit. jmockit 1.41 

2.3。jmockit的表现性

如前所述,JMockit的最强点之一是其表现性。为了创建模拟并定义其行为,而不是从模型API调用方法,只需直接定义它们。

这意味着您不会做的事情:

API.expect (mockInstance.method ()) .andThenReturn(值)同学(2);

相反,期待事情如:

new Expectation() {mockInstance.method();结果=价值;* = 2;}

它似乎是更多的代码,但你可以简单地把所有三行放在一个。真正重要的部分是您不会最终与链接的方法调用的大“火车”。相反,您最终会定义如何在调用时嘲笑。

如果你考虑到这一点结果=值您可以返回任何内容的部分(固定值,动态生成的值,例外等),JMockit的富有表现力变得更加明显。

2.4。记录重放验证模型

使用JMockit的测试分为三个差异化阶段:记录,重放和验证。

  1. 在这一点记录阶段,在测试准备期间和在我们要执行的方法的调用之前,我们将定义在下阶段期间使用的所有测试的预期行为。
  2. 重播阶段是执行被测试代码的阶段。以前在上一阶段记录的mock方法/构造函数的调用现在将被重放。
  3. 最后,在核实阶段,我们将断言测试结果是我们预期的结果(并且根据记录阶段中所定义的内容而使用该模拟的模型)。

在一个代码示例中,测试的线框看起来是这样的:

@Test public void testWireframe(){//准备代码不特定于JMockit,如果有新的期望(){{//为mock定义预期行为}};//执行代码测试新验证(){{//验证模拟}};/ /断言}

3.创造模拟

3.1。JMockit的注释

使用JMockit时,使用模拟的最简单方法是使用注释。有三个用于创建模拟(@mocked.@Injectable@Capturing),一个用来指定被测试的类(@Tested)。

当使用@mocked.在字段上注释,它将创建每个特定类的每个新对象的模型实例。

另一方面,与@Injectable注释,将仅创建一个映射的实例。

最后的注释,@Capturing就像@Mocked,但将扩展到扩展或实施注释字段类型的每个子类的范围。

3.2。通过参数来测试

使用JMockit时,可以将Mocks传递为测试参数。这对于创建一个尤其是一个测试的模型非常有用,例如某些复杂的模型对象,例如用于一个测试的特定行为。这将是这样的:

@runwith(jmockit.class)public类testpassingarguments {@injectable私有foo模型;@Tested私人酒吧吧;@test公共void testexample(@mocked xyz模型justthistt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​histt​​h模仿justthistest.someothermethod();}};bar.codeundertest();}}

这种通过将mock作为参数传递来创建mock的方法,而不必调用某些API方法,再次向我们展示了我们从一开始就在讨论的可表达性。金宝搏官网188be

3.3。完整的例子

为了结束本文,我们将包括一个使用JMockit的完整测试示例。

在本例中,我们将测试a表演者使用的课程合作者在它履行()方法。这履行()方法,接收一个模型对象作为它将使用它的参数getInfo ()返回一个字符串,此字符串将传递给合作()方法从合作者这将返回真正的对于这个特定的测试,该值将被传递给收到()方法从合作者

所以,被测试的类看起来像这样:

public class Model {public String getInfo(){return "info";}} public class Collaborator {public boolean collaboration (String String){return false;} public void receive(boolean bool){// NOOP}} public class Performer {private Collaborator Collaborator;public void perform(Model Model) {boolean value = collaborator.协作(Model . getinfo ());collaborator.receive(价值);}}

测试代码最终会如:

@runwith(jmockit.class)public class performertest {@确认私人协作者协作者;@Tested私人表演者表演者;@test public void testtheperformmethod(@mocked模型模型){new期望(){{model.getinfo();结果=“bar”;collaborator.colraborate(“酒吧”);结果=真实;}};performer.perform(型号);新验证(){{collaborator.receive(true);}};}}

4。结论

有了这个,我们将把我们的实际介绍联系在jmockit上。如果您想了解有关JMockit的更多信息,请留在未来金宝搏官网188be的文章中。

上可以找到本教程的完整实现GitHub项目。

4.1。该系列的文章

所有系列文章:

通用底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>看看这个课程
对这篇文章的评论关闭!