JUnit是Java编程语言最流行的单元测试框架。它可以帮助我们编写和运行可重复的测试。
// JUnit常用注解
@Test // 标记测试方法
@Before // 在每个测试方法之前执行
@After // 在每个测试方法之后执行
@BeforeClass // 在所有测试方法之前执行一次
@AfterClass // 在所有测试方法之后执行一次
@Ignore // 忽略测试方法
JUnit提供了多种断言方法来验证测试结果:
// JUnit断言方法
assertEquals(expected, actual); // 验证两个值是否相等
assertTrue(condition); // 验证条件是否为true
assertFalse(condition); // 验证条件是否为false
assertNull(object); // 验证对象是否为null
assertNotNull(object); // 验证对象是否不为null
assertSame(expected, actual); // 验证两个对象引用是否相同
assertNotSame(expected, actual); // 验证两个对象引用是否不同
import org.junit.Test;
import static org.junit.Assert.*;
public class CalculatorTest {
private Calculator calculator = new Calculator();
@Test
public void testAdd() {
assertEquals(4, calculator.add(2, 2));
}
@Test
public void testSubtract() {
assertEquals(2, calculator.subtract(4, 2));
}
import org.junit.*;
public class TestLifecycle {
@BeforeClass
public static void setUpClass() {
System.out.println("在所有测试方法之前执行一次");
}
@Before
public void setUp() {
System.out.println("在每个测试方法之前执行");
}
@Test
public void testMethod1() {
System.out.println("测试方法1");
}
@Test
public void testMethod2() {
System.out.println("测试方法2");
}
@After
public void tearDown() {
System.out.println("在每个测试方法之后执行");
}
@AfterClass
public static void tearDownClass() {
System.out.println("在所有测试方法之后执行一次");
}
}
测试套件允许我们将多个测试类组织在一起运行:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
CalculatorTest.class,
StringUtilsTest.class,
DateUtilsTest.class
})
public class AllTests {
// 这个类可以为空,它只是用来组织测试类
}
参数化测试允许我们使用不同的参数运行同一个测试方法:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
public class CalculatorTest {
private int input1;
private int input2;
private int expected;
public CalculatorTest(int input1, int input2, int expected) {
this.input1 = input1;
this.input2 = input2;
this.expected = expected;
}
@Parameterized.Parameters
public static Collection
测试方法可以验证是否抛出了预期的异常:
import org.junit.Test;
import static org.junit.Assert.*;
public class ExceptionTest {
@Test(expected = IllegalArgumentException.class)
public void testDivideByZero() {
calculator.divide(1, 0);
}
}