2011-12-12 3 views
0

나는 모기토와 TDD에 익숙하지 않다. 나는 그것을 사용하는 이유를 찾는데 어려움을 겪고있다. 특히 다음과 같은 문제를 발견했을 때 ... 나는 .. 나는 스프링 MVC 3.0.6, 최대 절전 모드, 메이븐 등 ..mockito 모의 제한 기준

@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); 
    } 
} 

지금 "는 조롱하기 위해 필요한이 물건을 테스트하기 위해 사용하고 내 UserService 클래스에"RegisterUser "방법을 테스트 할 userRepository.findByCriteria .. "그리고 난 다음 JUnit 테스트

@Test(expected = UserExistingException.class) 
public void registerExistingUserTest() throws DataAccessException, UserExistingException { 
    User user = new User(); 
    user.setUsername("gfalco77"); 
    user.setEmail("[email protected]"); 
    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를 사용해야 만한다는 것을 읽었습니다. 그러나 어떻게? 그리고 만약 내가 matchers를 사용한다면 ... 여전히 유효합니다. 뭔가 다른 테스트를 만드시겠습니까?

+0

Mockito와 TDD에 대한 당신의 생각 : 나는 단위 테스트와 TDD에 익숙하지 않았지만 JUnit + Mockito 콤보를 사용하기 시작했을 때 즉시 그와 사랑에 빠졌습니다. 엄격한 테스트를 쉽게 수행 할 수있는 좋은 방법입니다. 코드 테스트. 내가 알기로 TDD의 요점은 그러한 개발 모델은 모든 프로그램의 기능에 대한 테스트가 항상 있는지 확인하여 새 업데이트가 무언가를 깨뜨렸을 때 즉시 알 수 있도록하는 것입니다. 그것은 아마 모든 프로젝트에 가장 적합한 개발 모델이 아니지만, 저는이 철학을 염두에두고 있습니다. –

답변

3

귀하의 질문에 직접적인 대답은 아니지만 귀하의 서비스 클래스가 비즈니스 코드와 데이터 액세스 코드를 혼합하고 있기 때문에 테스트를 작성하기가 어렵습니다. findByCriteria 호출 당신은 그냥 그 것은 findByNameOrEmail 작품을 테스트 실제 저장소 단위 테스트, 테스트에이 간단한 방법을 조롱해야하고, 만들 것

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

같은 UserRepository의 높은 수준의 방법으로 캡슐화한다 테스트 데이터베이스에서 예상됩니다.

UserRepository가 findByCriteria 또는 findByQuery과 같은 일반 메소드 만 노출하는 경우 기준 또는 쿼리 생성이 저장소가 아닌 작성자이므로 리포지토리가 아닙니다. 그렇게하면 비즈니스 서비스에서 Hibernate 세션을 직접 사용하는 것 이상을 추가하지는 않는다.

+0

네, 그렇게 분명했습니다 ... 지금 작동합니다. 사실은 UserRepository가 findbycriteria가 미리 정의 된 GenericHibernateDaoImpl을 확장하고 있기 때문에 서비스에서 조건을 통과하는 것이 쉽습니다. – Gfalco

+0

이 메소드는 다음과 같이 보호되어야합니다. 서브 클래스는 호출 가능하지만 외부 클래스는 호출 할 수 없도록하십시오. 저장소의 공용 인터페이스에 있으면 안됩니다. –

관련 문제