我有一个类,我已经创建了与h2数据库的连接,使用旧的jdbc方法编写url并获取连接,我在数据库中创建一个表,这是表不是java对象,所以我用完了聪明的方法为我的方法编写测试 这个方法之一
//above would be the url and driver connection
//我也创建了一个表app_user public void addUser(连接连接, 字符串登录,字符串密码, 字符串描述)抛出SQLException {
System.out.println(String.format("Add user : %s", login));
String newUSer = "INSERT INTO app_user(login, password, description) VALUES (?,?,?)";
try (PreparedStatement preparedStatement = connection.prepareStatement(newUSer)) {
preparedStatement.setString(1, login);
preparedStatement.setString(2, password);
preparedStatement.setString(3, description);
// returns number of changed column
preparedStatement.executeUpdate();
}
}
我的测试方法看起来像这样,有没有办法让它不那么整洁,更简单,我试图用mockito进行模拟,但我的app_user表不是App_user类的对象,所以我写了这个
@Test
public void addUser() throws SQLException, ClassNotFoundException {
Class.forName("org.h2.Driver");
try (Connection connection = DriverManager.getConnection(URL, "sa", "")) {
String createTable =
"CREATE TABLE app_user(" +
"user_id INT NOT NULL AUTO_INCREMENT," +
"login VARCHAR (255) NOT NULL ," +
"password VARCHAR (255) NOT NULL ," +
"description VARCHAR (255) NULL," +
"PRIMARY KEY (user_id))";
try (Statement statement = connection.createStatement()) {
statement.executeUpdate(createTable);
Assert.assertNotNull(statement);
}
String addUser = "INSERT INTO app_user(login, password, description) VALUES (1234,'valentine','javaMan')";
PreparedStatement statement = connection.prepareStatement(addUser);
int rowAffected = statement.executeUpdate();
Assert.assertNotNull(rowAffected);
Assert.assertEquals(rowAffected,1);
}
但我不喜欢在我的测试中我再次创建连接的事实,注意 - 由于某种原因我不能使用对象作为表
答案 0 :(得分:1)
就创建JDBC连接而言,我认为这是一种优化方式,可以最大限度地减少您的工作量。 我不建议每次创建连接,而是建议编写表示JDBC连接的Singleton类。这样可以避免你一次又一次地做的一些工作。
以下代码的内容。 (跳过例外和进一步的细节)
class Database{
Connection jdbc;
//Can store username, url , password etc as private fields here
private Database(){
if(jdbc == null){
Class.forName("org.h2.Driver");
jdbc = DriverManager.getConnection("URL", "sa", "");
}
}
Connection getConnection(){
if(jdbc == null){
this();
}
return jdbc;
}
};
答案 1 :(得分:1)
我个人发现的最好的方法是创建一个静态类TestUtils
,并在其他方面添加一个静态方法来打开和查询db,以及另一种关闭连接的方法。连接本身是该类的成员。要搜索的SQL查询是字符串参数,ResultSet是要返回的值。
下面是班级。
public class TestUtils {
private static Connection conn = null;
private static java.sql.Statement stmt = null;
private static ResultSet rs;
public static ResultSet readDB(String sql) throws ClassNotFoundException, SQLException {
//lettura ladder da db insieme a configs
// JDBC driver name and database URL
final String DB_URL = "jdbc:mysql://localhost/sportservicelive";
// Database credentials
final String USER = "root";
final String PASS = "root";
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
conn = DriverManager.getConnection(DB_URL, USER, PASS);
//STEP 4: Execute a query
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
return rs;
}
public static void closeDB() throws SQLException {
stmt.close();
conn.close();
rs.close();
}
[...]
}
当然它包含对单元测试有用的各种其他方法。