在Java中测试布尔方法

在Java中测试布尔方法,java,junit,mockito,Java,Junit,Mockito,下午好, 我在测试布尔方法时遇到问题。 我有我的接口(Dao) 我的方法是 public boolean existUser(String email) throws UserException { try{ log.info("Verify exist email " + email); Map<String, Object> parametersMap = Maps.newHashMap();

下午好, 我在测试布尔方法时遇到问题。 我有我的接口(Dao)

我的方法是

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;
    }
public boolean existUser(字符串电子邮件)抛出UserException{
试一试{
日志信息(“验证存在电子邮件”+电子邮件);
Map参数Map=Maps.newHashMap();
参数映射放置(“电子邮件”,电子邮件);
Long count=npTemplate.queryForLong(“从DL_用户中选择count(*),其中EMAIL=:EMAIL”,参数map);
如果(计数>0){
返回true;
}
}捕获(例外e){
String errorMsg=“尝试获取“+email+”-ERROR”+e.getMessage()的用户id时出现异常;
UserException UEException=新的UserException(errorMsg,e);
抛出异常;
}       
返回false;
}

我想测试existUser方法。

创建一组测试数据,包括方法的参数,其中一些参数应产生
true
,一些
false
,其他参数应产生异常。依次使用每个值调用该方法,并用预期结果检查实际结果。使用具有已知内容的数据库,以便了解预期值

对于这种测试,我更喜欢TestNG


顺便提一下,
返回false
应该在
try
块中,并返回true。然后,您可以取消对
布尔值的测试,以返回
布尔值
,只需
返回计数>0

测试这类东西基本上有两种方法:

a) 正如Lew所建议的,您可以将此设置为集成测试,这意味着您实际连接到数据库、查询用户等。如果您想100%确定,您甚至可以在测试初始化期间创建用户,然后删除该用户(例如,将整个测试包装在一个事务中,并在最后执行回滚)。这将防止您的测试依赖于特定的数据库状态或使用测试数据扰乱数据库

b) 您还可以通过模拟将其作为单元测试。为此,您必须模拟
npTemplate
,这样就不需要实际的数据库连接。然后,您可以验证是否使用正确的参数调用了
npTemplate
。您还可以让它返回不同的数字来测试不同的情况,甚至让它抛出异常来测试。是这类东西的ToGo框架,但也有其他框架(例如)

解决方案b)的一个明显缺点是,您不能保证您的查询实际上是正确的,这就不需要太多的测试。尽管如此,我个人还是会编写两个测试,一个单元测试和一个集成测试,因为单元测试将确保查询周围的代码和结果处理是正确的,而集成测试将确保查询实际工作。(是的,集成测试还将确保代码正确,但运行集成测试通常需要更多的时间,因此您可以在开发过程中一直运行单元测试,只有在需要时才运行集成测试)

还有一点,用

return count > 0;

…将使您的代码更加简洁,因为您不会有两个不同的地方发生退货。

为什么不尝试一下,让我们知道您面临的问题是什么(异常…
,捕获特定的已检查异常。我在测试布尔方法时遇到问题。这些问题是什么?
return count > 0;