【发布时间】:2017-06-19 09:05:28
【问题描述】:
我已经开始学习单元测试了。我正在使用 JUnit 5,我想测试将一些数据插入数据库的方法(使用 JDBC)。这是我的代码:
Datasource.java
import java.sql.*;
public class Datasource {
public static final String CONNECTION = "jdbc:mysql://127.0.0.1:3306/java";
private Connection connection;
public boolean open() {
try {
connection = DriverManager.getConnection(CONNECTION, "root", "");
return true;
} catch (SQLException e) {
System.out.println(e.getMessage());
return false;
}
}
public boolean insertTable() {
try {
String query = "INSERT INTO artists(name) VALUES(?)";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, "Test");
int result = stmt.executeUpdate();
if (result == 1) return true;
return false;
} catch (SQLException e) {
System.out.println(e.getMessage());
return false;
}
}
}
DatasourceTest.java
import static org.junit.jupiter.api.Assertions.*;
class DatasourceTest {
private Datasource datasource;
@org.junit.jupiter.api.BeforeEach
void setUp() {
datasource = new Datasource();
if (!datasource.open()) {
System.exit(-1);
}
}
@org.junit.jupiter.api.Test
void insertTable() {
assertTrue(datasource.insertTable());
}
}
它工作正常,但它实际上在我的数据库中插入了一条记录,但我想做的是模拟它。是否可以仅使用 JUnit 来实现?如果没有,我需要什么?一个简单的实现将不胜感激。
编辑
我发现了一个名为 Mockito 的工具,这是我需要的吗?如果是这样,谁能告诉我如何部署我的方法 insertTable() 的简单测试?
【问题讨论】:
-
不,仅使用 JUnit 是不可能的,因为您正在测试与其他系统(在本例中为数据库)的集成。这些类型的测试通常不是单元测试,它们确实将数据发送到外部系统。
-
@M.Prokhorov 您可以测试正确的插入语句。你可以看看 PowerMockito。您可以在哪里模拟由静态
DriverManager创建的Connection并使用正确的插入语句验证connection.prepareStatement(query)调用 -
@kism3t 我找不到任何合理的教程,你能推荐一些东西吗,如何将它与 JUnit 5 和 JDBC 一起使用?
-
@kism3t,但这仍然无法仅使用 JUnit。我还发现编写测试来验证是否将硬编码的字符串常量传递给方法很愚蠢。
-
@BociucH,另外,您可能真的想重新考虑
System.exit(-1)声明。通过使用它,你会弄乱 JUnit 的错误报告系统。