下午好, 我在测试布尔方法时遇到了麻烦。 我有我的界面(Dao)
public interface UserDao {
public boolean existUser(String email) throws UserException;
}
我的方法是
public boolean existUser(String email) throws UserException {
try{
log.info("Verify exist email " + email);
Map<String, Object> parametersMap = Maps.newHashMap();
parametersMap.put("email", email);
Long count = npTemplate.queryForLong("SELECT count(*) FROM DL_USER WHERE EMAIL = :email", parametersMap);
if(count > 0){
return true;
}
}catch(Exception e){
String errorMsg = "There was an exception trying obtain user id for " + email + " - ERROR " + e.getMessage();
UserException uException = new UserException(errorMsg, e);
throw uException;
}
return false;
}
我想测试一下existsUser方法。
答案 0 :(得分:1)
创建一组测试数据,其中包含方法的参数,其中一些应该产生true
,一些false
,而另一些应该产生异常。依次用每个值调用方法,并用预期结果检查实际结果。使用具有已知内容的数据库,以便了解预期值应该是什么。
我更喜欢TestNG进行此类测试。
顺便说一句,return false;
应位于try
块内return true
。然后,您可以取消boolean
的测试,以返回boolean
,只需return count > 0;
。
答案 1 :(得分:1)
基本上有两种方法来测试这种东西:
a)正如Lew已经建议的那样,您可以将其设为集成测试,这意味着您实际连接到数据库,查询用户等。如果您想100%确定,那么您甚至可以在测试初始化期间创建用户并在之后删除用户(例如,通过将整个测试包装在事务中并在最后执行回滚)。这将阻止您的测试依赖于特定的数据库状态或使数据与测试数据混乱。
b)您也可以通过模拟将其设为单元测试。为此,您必须模拟npTemplate
,无需实际的数据库连接。然后,您可以验证是否使用正确的参数调用了npTemplate
。你也可以让它返回各种数字来测试不同的情况,甚至让它抛出Exceptions来测试它。 Mockito是这类内容的框架,但也有其他内容(例如EasyMock)。
解决方案b)的明显缺点是,您不能保证您的查询实际上是正确的,这不会留下太多的考验。不过,我个人会编写测试,单元测试和集成测试,因为单元测试将确保查询周围的代码和结果处理是正确的,而集成测试将确保你的查询确实有效。 (是的,集成测试还将确保代码正确,但运行集成测试通常需要花费更多时间,因此您可以在开发期间始终运行单元测试,并仅在需要时进行集成测试)。 p>
还有一点P.S.,使用......
return count > 0;
...将使您的代码更简洁,因为您不会有两个不同的地方返回。