JUnit&JMockit 单元测试总结
1.JUnit 简介
Java 单元测试框架业内应用较多的是 JUnit, 它由 Kent Beck 和 Erich Gamma 建立, 逐渐成为源于 Kent Beck 的 sUnit 的 xUnit 家族中最为成功的一个. JUnit 有它自己的 JUnit 扩展生态圈. 多数 Java 的开发环境都已经集成了 JUnit 作为单元测试的工具.
目前 JUnit 主流版本有 3.x,4.x 和 5.x, 目前继续推荐使用 4.x 版本, 各个 IDE 中也自动集成了它.
2.JMockit 简介
基于 Junit 单元测试的框架有很多, 包括 EasyMock,JMock,mockito,JMockit 等. Mock 框架也能进行 stub 的测试方法. 但通过各种测试框架的对比, JMockit 对于目前流行的测试方法全部支持, 功能强大. 因此选择 JMockit 作为 Junit 单元测试的框架.
JMockit 是帮助创建 mock 对象的工具, 它基于 Java 开发, 在 Java 测试与开发环境中有不可比拟的优势, 更重要的是, 它大大简化了虚拟对象的使用.
3.Maven 集成单元测试工具
- <!-- 版本号 -->
- <properties>
- <junit.versioin>4.12</junit.versioin>
- <jmockit.version>1.34</jmockit.version>
- </properties>
- <!-- 依赖 -->
- <dependencies>
- ???<dependency>
- ?????<groupId>org.jmockit</groupId>
- ?????<artifactId>jmockit</artifactId>
- ?????<version>${jmockit.version}</version>
- ?????<scope>test</scope>
- </dependency>
- ?<dependency>
- ?????<groupId>junit</groupId>
- ?????<artifactId>junit</artifactId>
- ?????<version>${junit.versioin}</version>
- ?????<scope>test</scope>
- ?</dependency>
- </dependencies>
4. 单元测试的使用
JUnit4 基础语法
Junit4.x 区别与之前的版本, 无需显示的声明测试类继承于 TestCase. 通过使用 Junit annotation 进行编写单元测试用例.
@Test: 标识测试方法
@Ignore: 被忽略的测试方法或测试类
@Before: 初始化方法, 在任何一个测试执行之前必须执行的代码
@After: 释放资源, 在任何测试执行之后需要进行的收尾工作. 在每个测试方法执行之后执行一次, 该 annotation 只能修饰 public void 方法;
@BeforeClass: 针对所有测试, 只执行一次, 且必须为 public static void; 一般用于初始化必要的消耗较大的
资源, 例如数据库连接等
@AfterClass: 针对所有测试, 将会在所有测试方法执行结束后执行一次, 且必须为 public static void;
@Parameters: 进行单元测试的时候, 通常一个方法需要好几个 case 进行测试, Junit 提供参数化便于我们对方法进行多种参数的组合测试
4.9 之后引入 @Rule 和 @ClassRule, 本质上是对 @BeforeClass, @AfterClass, @Before, @After 等的另一种实现, 只是功能上更灵活多变, 易于扩展, 且方便在类和项目之间共享.
两个注解使用时需要放在实现了 TestRule 接口的 Rule 变量或返回 Rule 的方法之上, 且修饰符都必须为 public.@Rule 为变量或方法级注解, 每个测试方法执行时都会调用被该注解修饰的 Rule;@ClassRule 为类级注解, 执行单个测试类时只会调用一次被该注解修饰的 Rule.
JMockit 基础语法
JMockit 的测试更多是基于注解来实现的. Jmockit 中常用的注解有:
@Mocked: 被修饰的对象将会被 Mock, 对应的类和实例都会受影响 (同一个测试用例中)
@Mocked 是针对类型的, 可用于测试类成员 mock ?eld 与参数用例参数 mock parameter. 对 mock ?eld 的注解作用于整个测试类, 而对 mock parameter 的注解只针对该测试用例.
@Injectable: 仅 Mock 被修饰的对象
@Injectable 是针对单个实例的, 可用于测试类成员 mock ?eld 与参数用例参数 mock parameter. 对 mock ?eld 的注解作用于整个测试类, 而对 mock parameter 的注解只针对该测试用例.
@Capturing: 可以 mock 接口以及其所有的实现类
@Capturing 标识一个被 Mock 的对象, 从该对象派生的子类也被 Mock 了. 可以通过 maxInstances 方法来指定最大有多少层子类也被 mock. 当然和 @Mocked 以及 @Injectable 一样, 均可用作 class ?eld 和测试用例的参数的注解. 同时, 它是针对类型的.
@Tested: 指定被测试的对象
@Tested 标识一个被测对象的实例. 通过 @Tested 标签标识的被测对象实例, 将会在测试方法执行之前被初始化.
@Mock:MockUp 模式中, 指定被 Fake 的方法
来源: http://www.bubuko.com/infodetail-3325889.html