我有一个方法调用另一个方法来检索数据并将其插入数据库,我如何在Junit中测试此方法,因为此方法没有检索任何内容?任何人都可以提供一些这种情况的例子吗?
public static void method(){
User user = getUser();
try {
String Query = "INSERT INTO users (USER_ID , Name) VALUES ("
+user.getID()+","+user.getName()+")";
Statement statement = conn.createStatement();
statement.executeUpdate(Query);
} catch (Exception e) {
e.printStackTrace();
}
}
我正在考虑为用户使用模拟对象,但我不知道如何检查用户是否插入到数据库中。请帮忙。
这里有一些指针,但在此之前,你必须确定测试中的代码是什么。我说这个的原因是因为这实际上会让你重构代码。
例如,对于以下代码:
public static void method(){
User user = getUser();
try {
String query = "INSERT INTO users (USER_ID , Name) VALUES ("
+user.getID()+","+user.getName()+")";
Statement statement = conn.createStatement();
statement.executeUpdate(query);
} catch (Exception e) {
e.printStackTrace();
}
}
你可能想测试以下内容: -
现在,出于以上几点,可能存在一些具有更高重要性的点,例如确保正确构建查询。
因此,为此,应该从此方法中提取查询构建器代码,现在您可以在单独的单元测试中轻松测试此查询。
同样,您希望确保在作业完成后关闭连接。因此,您可能希望将此代码提取到接受查询作为参数的方法,打开连接,执行DB CRUD关闭连接并返回输出。并确保您不会在不同的方法中一直重复此代码。
现在,让我们去指点: -
unit test
的一部分进行测试。数据库驱动程序等已经拥有自己的测试并且已在全球范围内使用。your method
需要进行测试是否被调用的次数是多少次(it's what you want to test
)。它被称为interaction based testing
您可以使用mocking(Mockito)并删除测试中的方法,然后断言应该调用该方法的次数。请参阅this和this链接。
希望能帮助到你!
应根据预期行为测试类。
在这里测试返回类型(即使它有其他东西作为void
)没有任何意义。
您的方法执行SQL查询。 因此,您的单元测试必须声明对数据库的预期副作用:具有预期值的插入。 请注意,要进行可重现且快速的测试,您应该支持嵌入式数据库进行单元测试。