[英]JUnit test for a method that contains SQL queries
我有一个旧的 Java 项目(没有使用框架/构建工具),它有一个充满 SQL 方法和相应 Bean 类的类。 SQL 方法主要使用 SELECT、INSERT 和 UPDATE 查询,如下所示:
public static void sqlUpdateAge(Connection dbConnection, int age, int id) {
PreparedStatement s = null;
ResultSet r = null;
String sql = "UPDATE person SET age = ? WHERE id = ?";
try {
s = dbConnection.prepareStatement(sql);
s.setInt(1, age);
s.setInt(2, id);
s.addBatch();
s.executeBatch();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (r != null)
r.close();
if (s != null)
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
当涉及到 SQL 查询时,单元测试的最佳实践是什么?
我能想到的最简单的方法是使用我的开发数据库; 只需在测试类中调用 sqlUpdateAge(),查询数据库中的结果集并 assertTrue 设置的年龄在结果集中。 但是,这会用不必要的数据填满开发数据库,我想避免这种情况。
是创建所谓的内存数据库的解决方案还是以某种方式回滚我所做的更改?
如果我需要一个内存数据库:
我建议看看你是否可以从自动构建开始。 那是通过引入构建工具(例如 maven 或 gradle) - 或者如果不可能 - scipting 构建。 无论如何,您的目标应该是在代码更改时轻松触发构建和测试。
如果您不能在保证所有单元测试都已运行的情况下对每个更改生成一致的构建,那么首先编写单元测试就真的没有价值。 那是因为否则,您的测试最终将因代码修改而失败,除非您的所有测试都自动运行,否则您不会注意到。
一旦你有了它,你可能会有一些关于如何运行单元或集成测试的提示。
由于您无法从许多应用程序框架提供的测试支持中受益,因此您基本上可以自行决定如何配置数据库测试设置。 在那种情况下,我不认为内存数据库真的是最好的选择,因为:
我能想到的两种选择是:
这些建议仅适用于您有 shell 经验和/或得到操作人员支持的情况。 如果没有,设置 H2 可能更容易、更直接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.