JUnit 5 - JDBC 语句测试



我已经开始学习单元测试了。我正在使用 JUnit 5,我想测试将一些数据插入我的数据库(使用 JDBC(的方法。这是我的代码:

数据源.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;
        }
    }
}

数据源测试.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(( 的简单测试?

这就是我使用 mockito 测试插入表方法所做的

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());
    }    
}

您可以将 DbUnit 框架与 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(?)"));
    }
}

希望这有帮助。

最新更新