首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Jmockit用户指南中文翻译(未校准)之一

2012-06-26 
Jmockit用户指南中文翻译(未校对)之一最近一直在着力推动部门单元测试工作,发现一些不规范的地方,特此尝试

Jmockit用户指南中文翻译(未校对)之一

最近一直在着力推动部门单元测试工作,发现一些不规范的地方,特此尝试翻译下用户指南,方便大家参考。

?

原文参考:public void testDoOperationAbc(final DependencyXyz mock) { new NonStrictExpectations() { AnotherDependency anotherMock; { anotherMock.doSomething("test"); result = 123; } }; new ServiceAbc().doOperation("some data"); new Verifications() {{ mock.complexOperation(true, anyInt, null); times = 1; }}; }Mocked types?
两个单元之间的交互通常以方法或者构造函数调用的形式出现。以参数和返回值的形式在当前单元和被依赖的单元之间传递构成的调用集合,定义了我们感兴趣的测试代码行为。另外,对于给定的一个测试,可能需要判定调用集合在执行期间的执行顺序。注意,一个单元测试应该只是执行可测试的单元代码。这些实现所依赖的关系不一定需要被执行,因为这些依赖并不是当前单元测试的一部分。所以,单元测试的目标应该是测试一些业务逻辑,这些逻辑是和真实行为需要依赖的外部关系或者环境是隔离的。现在,对于给定的单元,我们一般不需要隔离所有的依赖,但需要隔离如下这些:1)一些依赖单元本身已经(或者将来会有,只是目前还没有实现而已)拥有自己的单元测试。2)由于一些特殊原因,在测试环境中,一些并不是很容易快速的执行的单元(因为它们可能会写数据库或者发送邮件等等)。当我们编写一个特殊的单元测试时,我们一般假设它对外部的依赖是满足一些期望的。如果不是的话,那就是外部的依赖本身所需要负的责任了,并应该满足这些期望。

Mocked 类型

一般来说,在单元测试代码中,方法调用、构造函数以及那些相互依赖 /协助的单元都是我们mock的目标。 Mock技术提供了一种隔离外部依赖的可测试的单元机制。我们通过使用mocked声明,可以在指定的测试代码对一些特殊的依赖进行 mock模拟,也就是说,一个mocked类型,应该是单元测试中的一个依赖类型,这些类型可以是引用、接口、抽象类、具体的类、final 类等等。

默认情况下,被mock的类型的所有方法在测试期间都被 mock实现。如果一个mock类型被声明为类,那么除了java.lang.Object之外,该类的父类将被递归mock。因此,继承的方法也将自动被mock。同样,对于声明为类的mock类型,其所有构造函数也将被 mock。甚至,无论方法或者构造函数的修饰符是否是private,stati,final,native等,这些方法和构造函数都会被mock掉,对于mock类型来说,修饰符的定义变得如此不重要了。

在一个测试调用中,如果当一个方法或者构造函数被mock了,则其原始的实现代码将不会被执行,取而代之的是,可以通过 jmockit显式或者隐式指定测试调用。下面的示例代码,展示了一个mock类型的基本调用图。在这个指南中,我们通常使用类似这样的代码。当然,粗体部分的注释才是我们现在的重点。

@Test   public void doBusinessOperationXyz()   {      ...       new Expectations() // 一个称为期望的结构块      {         Dependency mockInstance; // "Dependency"是我们需要mock的类型         ...          {            ...            // "mockInstance" 是一个mock实例,在测试代码中自动提供如下类型的mock使用方法            mockInstance.mockedMethod(...);            ...         }      };       ...   }
?

?

@Test public void doBusinessOperationXyz() { ... new Expectations() { Dependency mockInstance; ... { ... // 一个mock实例的mock方法 mockInstance.someMethod(1, "test"); ... } }; //这里应该是一个单元测试方法调用,这个调用可能匹配(也可能不匹配)上面指定的expectations }?

?

@Test public void someTestMethod() { // 1. 准备阶段:测试执行之前所需要的所有东西都可以编写在这里 ... // 2. 单元测试代码在这里执行,通常是通过调用public方法来执行 ... // 3. 验证阶段:验证上面所执行的单元测试代码真正执行了其业务逻辑 ... }?import mockit.*;... other imports ... public class SomeTest{ // 零个或者更多的mock 属性, 这些属性对于整个类的所有测试方法来说是通用的。 @Mocked Collaborator mockCollaborator; @NonStrict AnotherDependency anotherDependency; ... @Test public void testWithRecordAndReplayOnly(mock parameters) { // 如果这里需要测试前的准备,可以在这里执行,但对于Jmockit 来说,对此没特别要求。当然这里也可以为空。 new Expectations() // 一个期望块 { // 零个或者多个局部 mock 属性域 { // 一个或者多个mock对象(类型)的调用,这些调用会被Expectations记录(Recorded)下来 //一些没有被mock的方法、对象类型等同样可以在这个期望块里面调用 } }; // 单元测试代码真正业务逻辑在此执行 // 如果需要,可以在这里进行验证代码编写,当然可以利用JUnit/TestNG 断言 } @Test public void testWithReplayAndVerifyOnly(mock parameters) { // 如果这里需要测试前的准备,可以在这里执行,但对于Jmockit 来说,对此没特别要求。当然这里也可以为空。 // 单元测试代码真正业务逻辑在此执行 new Verifications() {{ // 一个验证块 // 一个或者多个mock对象(类型)的调用,这些调用用于验证结果是否正确 //一些没有被mock的方法、对象类型等同样可以在这个验证块里面调用 }}; // 如果需求,这里可以添加其他额外的验证代码, // 当然,这些验证可以编写在这里,也可以在Verifications块之前 } @Test public void testWithBothRecordAndVerify(mock parameters) { //如果这里需要测试前的准备,可以在这里执行,但对于Jmockit 来说,对此没特别要求。当然这里也可以为空。 new NonStrictExpectations() { // 同样是一个期望块 //零个或者多个局部 mock 属性域 { // 一个或者多个mock对象(类型)的调用,这些调用会被Expectations记录(Recorded)下来 } }; // 单元测试代码真正业务逻辑在此执行 new VerificationsInOrder() {{ // 同样是一个验证块 // 一个或者多个mock对象(类型)的调用,这些调用将期望按照特定的顺序进行比较。 }}; // 如果需求,这里可以添加其他额外的验证代码, // 当然,这些验证可以编写在这里,也可以在Verifications块之前 }?

?

?

1 楼 az12xc34 2012-04-20   谢谢,

我也想慢慢看懂,奈何英文水平有限,经理催的紧。没办法,

热点排行