Mock的限制标准



我得说我是Mockito和TDD的新手。我正在努力寻找使用它的理由。特别是当我发现像下面这样的问题…我想在我的UserService类中测试一个"RegisterUser"方法。我使用的是spring mvc 3.0.6, Hibernate, Maven等。

@Override
public void registerUser(User user, UserRoles userRole) throws DataAccessException, UserExistingException {
    checkExistingUser(user);
    user.addRole(new Role(userRole));
    String password = encryptPassword(user);
    userRepository.makePersistent(user);
    sendWelcomeEmail(user.getFirstname(), user.getUsername(), password, user.getEmail());
}
private void checkExistingUser(User user) throws UserExistingException {
    List<User> users = userRepository.findByCriteria(Restrictions.or(Restrictions.eq("username", user.getUsername()), Restrictions.eq("email", user.getEmail())));
    if (!CollectionUtils.isEmpty(users)) {
        User userFound = users.get(0);
        List<String> fields = new ArrayList<String>();
        if (userFound.getUsername().equals(user.getUsername())) {
            fields.add("username");
        }
        if (userFound.getEmail().equals(user.getEmail())) {
            fields.add("email");
        }
        throw new UserExistingException(fields);
    }
}

现在要测试这些东西,我需要模拟"userRepository"。我尝试了以下的单元测试

@Test(expected = UserExistingException.class)
public void registerExistingUserTest() throws DataAccessException, UserExistingException {
    User user = new User();
    user.setUsername("gfalco77");
    user.setEmail("Giuseppe.falco@gmail.com");
    List<User> users = new ArrayList<User>();
    users.add(user);

    Mockito.when(userRepository.findByCriteria(Restrictions.or(Restrictions.eq("username", user.getUsername()), Restrictions.eq("email", user.getEmail())))).thenReturn(users);
    userService.registerUser(user, UserRoles.ROLE_USER);
    Mockito.verify(userRepository).makePersistent(user);
}

但是"users"列表似乎总是空的。在之前的一篇文章中,我读到限制不是同一个对象,也许我必须使用Matchers..但如何?如果我使用匹配器。用不同的东西创建测试仍然有效吗?

这不是对您的问题的直接回答,但是您的测试很难编写,因为您的服务类混合了业务代码和数据访问代码。findByCriteria调用应该封装到UserRepository的一个更高级的方法中,比如

List<User> findByNameOrEmail(String name, String email)

您只需要在测试中模拟这个简单的方法,并进行实际的存储库单元测试,测试findByNameOrEmail在测试数据库上是否按预期工作。

如果您的UserRepository只公开这样的通用方法,如findByCriteriafindByQuery,那么它就不再是一个真正的存储库了,因为创建标准或查询是调用者的责任,而不是存储库的责任。这样做并不会比直接在业务服务中使用Hibernate会话增加更多的内容。

相关内容

  • 没有找到相关文章

最新更新