有点需要注意,当 JUnit 主线程退出,子线程也会跟着退出,需要使用子线程的 join() 方法使主线程等待
Maven 依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
// src/main/java/club/seliote/App.java
package club.seliote;
public class App
{
public int add(int first, int second) {
return first + second;
}
public int exception() {
throw new NullPointerException();
}
}
// src/test/java/club/seliote/AppTest.java
package club.seliote;
import org.junit.*;
/**
* Unit test for simple App.
*/
public class AppTest
{
/**
* 用于保存 @Before 生成的数据
*/
private App app = null;
/**
* 每个测试方法执行前都需要重新构造对象
*/
public AppTest() {
super();
System.out.println("#Constructor");
}
/**
* static 方法,测试类中第一个执行
*/
@BeforeClass
public static void beforeClassTest() {
System.out.println("#BeforeClass");
}
/**
* 初始化一些每个 @Test 方法都会用到的数据
*/
@Before
public void beforeTest() {
this.app = new App();
System.out.println("#Before");
}
@Test
public void testAdd() {
System.out.println("#TestAdd");
Assert.assertEquals(6, this.app.add(3, 3));
if (8 != this.app.add(1, 7)) {
Assert.fail("Something error!");
}
}
/**
* 超时测试
*/
@Test(timeout = 100)
public void testTimeout() {
Math.pow(10, 100);
}
/**
* 异常测试
*/
@Test(expected = NullPointerException.class)
public void testIO() {
System.out.println("#TestException");
this.app.exception();
}
@After
public void afterTest() {
this.app = null;
System.out.println("#After");
}
@AfterClass
public static void afterClassTest() {
System.out.println("#AfterClass");
}
}
// output :
// #BeforeClass
// #Constructor
// #Before
// #After
// #Constructor
// #Before
// #TestAdd
// #After
// #Constructor
// #Before
// #TestException
// #After
// #AfterClass