我正在使用DBUnit和H2数据库来测试Java代码。
在制作中,我们使用MySQL。需要测试的代码是
public int getReplicationLag(String endTime) throws SQLException, ClassNotFoundException {
Class.forName(driverClass);
Properties connProps = new Properties();
connProps.put("user", userName);
connProps.put("password", password);
String query = "select time_to_sec(timediff(ts, ?)) from Foo";
int currentLag = 0;
try(Connection con = DriverManager.getConnection(connectionString, connProps)) {
try (PreparedStatement stmt = con.prepareStatement(query)) {
stmt.setString(1, endTime);
try(ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
currentLag = rs.getInt(1);
}
}
}
}
return currentLag;
}
我写了我的测试用例,但是当我执行测试用例时,它说
java.lang.AssertionError: Exception thrown Function "TIME_TO_SEC"
not found; SQL statement:
select time_to_sec(timediff(ts, ?)) from Foo [90022-190]
[Ljava.lang.StackTraceElement;@3152cf21
at org.junit.Assert.fail(Assert.java:88)
at
因此似乎H2数据库中不存在time_to_sec函数。 所以现在该怎么办?开始针对mysql实例进行测试?它不会打破一些单元测试原则吗?因为针对真实数据库的测试看起来像是集成测试。 (我可能错了)。
在这种情况下你会做什么?以与H2兼容的方式更改查询? ..但后来我重新发明轮子,因为mysql已经给了我这个功能。
另外,如果我带入了mysql,那么我的测试变得复杂,因为现在我必须加密/解密凭据。 (这对H2来说不是问题)。