Java单元测试JUnit

JUnit是Java开发中使用最为广泛的单元测试框架,如果你是一个Java工程师,相信你一定听过或者用过它。

JUnit有两个常用的版本:JUnit4JUnit5

常用注解

描述 JUnit4 JUnit5
测试方法 @Test @Test
在每个test方法之前执行 @Before @BeforeEach
在每个test方法之后执行,主要用于释放外部资源 @After @AfterEach
在当前类的所有方法之前执行,并且仅执行一次,方法必须为static void @BeforeClass @BeforeAll
在当前类的所有方法之后执行,并且仅执行一次,主要用于释放昂贵的外部资源,方法必须为static void @AfterClass @AfterAll
忽略测试方法 @Ignore @Disable

执行顺序:@BeforeClass -> @Before -> @Test -> @After -> @Before -> @Test -> @After -> … -> @AfterClass。

断言方法

JUnit4在org.junit.Assert类中提供了一系列的断言方法。

为了提高可读性,在使用这些方法时,JUnit4推荐采用静态导入的方式。

1
import static org.junit.Assert.*;
  • assertTrue(boolean condition)
  • assertNotNull(Object object)
  • assertEquals(Object expected, Object actual)
  • ……

JUnit初体验

下面以测试单表查询为例,建表语句如下:

1
2
3
4
5
6
7
8
9
10
drop database if exists `test_jdbc`;
create database `test_jdbc`;
use `test_jdbc`;
create table `user` (
id bigint(20) not null auto_increment,
username varchar(255) not null,
primary key(id)
);
insert into user (username) values ('test1');
insert into user (username) values ('test2');

使用JUnit4的测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class JdbcTest {

private static Connection connection;
private Statement stmt;

@BeforeClass
public static void loadDriver() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_jdbc", "root", "mysqladmin");
System.out.println("execute @BeforeClass");
}

@Before
public void openStatement() throws SQLException {
stmt = connection.createStatement();
System.out.println("execute @Before");
}

// @Ignore
@Test
public void testQuery() throws SQLException {
ResultSet rs = stmt.executeQuery("select username from user");
while (rs.next()) {
String username = rs.getString("username");
assertNotNull(username);
}
System.out.println("execute @Test");
}

@Test
public void testUpdate() throws SQLException {
int result = stmt.executeUpdate("update user set username = 'username1' where id = 1");
assertTrue(result > 0);
System.out.println("execute @Test");
}

@After
public void close() throws SQLException {
stmt.close();
System.out.println("execute @After");
}

@AfterClass
public static void closeConnection() throws SQLException {
connection.close();
System.out.println("execute @AfterClass");
}

}

注意:上面的打印语句只是为了说明不同注解的执行顺序。

在实际编写测试代码时,不建议使用System.out,推荐采用断言方法。


----------本文结束感谢您的阅读----------
坚持原创技术分享,您的支持将鼓励我继续创作!