JUnit 5 - JDBC 语句测试
JUnit 5 - JDBC statements testing
我开始学习单元测试了。我正在使用 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() 的简单测试?
您可以将 DbUnit framework 与 H2 或 HSQL 内存数据库一起使用。
您将打开与内存数据库的真实连接,您可以使用数据集检查记录是否已保存
因此,如果将 PowerMockito 与版本 1.6.5 一起使用,我将按以下方式测试您的代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Datasource.class, DriverManager.class, Connection.class })
public class DatasourceTest {
@Mock
Connection con;
@Mock
PreparedStatement ps;
@Test
public void insertTableTest() throws Exception {
PowerMockito.mockStatic(DriverManager.class);
PowerMockito.when(DriverManager.getConnection(
Mockito.eq("jdbc:mysql://127.0.0.1:3306/java"),
Mockito.eq("root"),
Mockito.eq(""))).thenReturn(con);
Datasource ds = Mockito.mock(Datasource.class);
PowerMockito.doCallRealMethod().when(ds).open();
PowerMockito.doCallRealMethod().when(ds).insertTable();
boolean result = ds.open();
Assert.assertTrue(result);
Mockito.when(con.prepareStatement(Mockito.eq("INSERT INTO artists(name) VALUES(?)"))).thenReturn(ps);
Mockito.when(ps.executeUpdate()).thenReturn(1);
result = ds.insertTable();
Assert.assertTrue(result);
Mockito.verify(ps).setString(Mockito.eq(1), Mockito.eq("Test"));
Mockito.verify(ps).executeUpdate();
Mockito.verify(con).prepareStatement(Mockito.eq("INSERT INTO artists(name) VALUES(?)"));
}
}
希望对您有所帮助。
这是我使用 mockito 测试 insetTable 方法所做的
import static org.junit.Assert.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class DatasourceTest {
@InjectMocks
Datasource datasource;
@Mock
Connection connection;
@Mock
PreparedStatement stmt;
@Before
public void setUp() throws SQLException {
when(connection.prepareStatement(eq("INSERT INTO artists(name) VALUES(?)"))).thenReturn(stmt);
when(stmt.executeUpdate()).thenReturn(1);
}
@Test
public void testInsertTable() {
assertTrue(datasource.insertTable());
}
}
我开始学习单元测试了。我正在使用 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() 的简单测试?
您可以将 DbUnit framework 与 H2 或 HSQL 内存数据库一起使用。
您将打开与内存数据库的真实连接,您可以使用数据集检查记录是否已保存
因此,如果将 PowerMockito 与版本 1.6.5 一起使用,我将按以下方式测试您的代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Datasource.class, DriverManager.class, Connection.class })
public class DatasourceTest {
@Mock
Connection con;
@Mock
PreparedStatement ps;
@Test
public void insertTableTest() throws Exception {
PowerMockito.mockStatic(DriverManager.class);
PowerMockito.when(DriverManager.getConnection(
Mockito.eq("jdbc:mysql://127.0.0.1:3306/java"),
Mockito.eq("root"),
Mockito.eq(""))).thenReturn(con);
Datasource ds = Mockito.mock(Datasource.class);
PowerMockito.doCallRealMethod().when(ds).open();
PowerMockito.doCallRealMethod().when(ds).insertTable();
boolean result = ds.open();
Assert.assertTrue(result);
Mockito.when(con.prepareStatement(Mockito.eq("INSERT INTO artists(name) VALUES(?)"))).thenReturn(ps);
Mockito.when(ps.executeUpdate()).thenReturn(1);
result = ds.insertTable();
Assert.assertTrue(result);
Mockito.verify(ps).setString(Mockito.eq(1), Mockito.eq("Test"));
Mockito.verify(ps).executeUpdate();
Mockito.verify(con).prepareStatement(Mockito.eq("INSERT INTO artists(name) VALUES(?)"));
}
}
希望对您有所帮助。
这是我使用 mockito 测试 insetTable 方法所做的
import static org.junit.Assert.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class DatasourceTest {
@InjectMocks
Datasource datasource;
@Mock
Connection connection;
@Mock
PreparedStatement stmt;
@Before
public void setUp() throws SQLException {
when(connection.prepareStatement(eq("INSERT INTO artists(name) VALUES(?)"))).thenReturn(stmt);
when(stmt.executeUpdate()).thenReturn(1);
}
@Test
public void testInsertTable() {
assertTrue(datasource.insertTable());
}
}