我必须说我是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.findByCriteria ..”,我尝试了以下junit测试
@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);
}
但似乎“用户”列表总是空的。在上一篇文章中我读到限制不是同一个对象,也许我必须使用Matchers ..但是如何?如果我使用匹配器..是否仍然有效创建一个不同的测试?
答案 0 :(得分:3)
这不是您问题的直接答案,但您的测试很难编写,因为您的服务类正在将业务代码与数据访问代码混合在一起。 findByCriteria
调用应该封装在UserRepository
类似
List<User> findByNameOrEmail(String name, String email)
您只需在测试中模拟这个简单的方法,并进行实际的存储库单元测试,测试findByNameOrEmail
在测试数据库上按预期工作。
如果UserRepository只公开诸如findByCriteria
或findByQuery
之类的通用方法,那么它就不再是一个存储库了,因为标准或查询的创建是调用者的责任,而不是存储库。这样做不会比直接在业务服务中使用Hibernate会话增加更多。