天天看点

Java单元测试之 JUnit

引入maven依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>           

创建测试用例(建议以方法为单位编写单元测试用例)

Demo.java

public class Demo {
 
    public String method() {
 
        return "This is a demo method.";
    }
}           

DemoTest.java

import org.junit.Assert;
import org.junit.Test;
 
public class DemoTest {
 
    @Test
    public void method() throws Exception {
 
        Demo demo = new Demo();
 
        String result = demo.method();
 
        Assert.assertEquals(result, "This is a demo method.");
    }
}           

Rule(规则)

JUnit4中包含两个注解@Rule和@ClassRule用于修饰Field或返回Rule的 Method,Rule是一组实现了TestRule接口的共享类,提供了验证、监视TestCase和外部资源管理等能力。JUnit提供了以下几个Rule实现,必要时也可以自己实现Rule。

  • Verifier: 验证测试执行结果的正确性。
  • ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败。
  • ExpectedException: 提供灵活的异常验证功能。
  • Timeout: 用于测试超时的Rule。
  • ExternalResource: 外部资源管理。
  • TemporaryFolder: 在JUnit的测试执行前后,创建和删除新的临时目录。
  • TestWatcher: 监视测试方法生命周期的各个阶段。
  • TestName: 在测试方法执行过程中提供获取测试名字的能力。

简单的说就是提供了测试用例执行过程中一些通用功能的共享的能力,使我们不必重复编写一些功能类似的代码。JUnit用于标注Rule的注解包括@Rule和@ClassRule,区别在于作用域不同@Rule的作用域是测试方法,@ClassRule则是测试Class。

Assume(假设)

Assume直译为假设,是JUnit提供的一套用于判断测试用例的入参是否有业务含义的工具,如果入参不符合预期时会抛出AssumptionViolatedException,默认的BlockJUnit4ClassRunner及其子类会捕获这个异常并跳过当前测试,如果使用自定义的Runner则无法保证行为,视Runner的实现而定。 Assume提供的验证方法包括:

  • assumeTrue/assumeFalse
  • assumeNotNull
  • assumeThat
  • assumeNoException

具体含义都比较简单。

Assert(断言)

Assert是JUnit提供的断言类,用于常用的测试结果验证。提供的功能和方法都比较简单实用,这里只用列表简单介绍:

  • assertTrue、assertFalse:结果的true、false。
  • assertThat:使用Matcher做自定义的校验。
  • assertEquals、assertNotEquals:判断两个对象是否相等。
  • assertNull、assertNotNull:判断对象是否为空。
  • assertSame:判断两个对象是否为同一个,不同于equals这里是使用“==”判断。
  • assertArrayEquals:判断两个数组是否相等。