2017-12-12 1 views
0

일부 테스트 코드를 작성하고 있습니다. 스프링 부트 1.5.9.RELEASE를 사용합니다.spring-data-jpa 및 MockMvc로 봄 부팅 junit 테스트

이 sampleUser에서 내 테스트 코드

@Test 
public void shouldUpdateUserName() throws JsonProcessingException, Exception { 
    for(UserDto.Request request: userRequests) { 
     User user = new User(); 
     user.setName(request.getName()); 
     user.setCity(cityRepository.findTopByName(request.getCity())); 

     userRepository.save(user); 
    } 

    UserDto.Request sample = userRequests.get(new Random().nextInt(count)); 
    User sampleUser = userRepository.findTopByName(sample.getName()); 

    String userNameAfterUpdate = sampleUser.getName() + Thread.currentThread().getName(); 

    UserDto.Request request = new UserDto.Request(); 
    request.setCity(sampleUser.getCity().getName()); 
    request.setName(userNameAfterUpdate); 

    mockMvc.perform(put("/user/" + sampleUser.getId()) 
      .contentType(MediaType.APPLICATION_JSON) 
      .content(objectMapper.writeValueAsString(request))) 
     .andDo(print()) 
     .andExpect(status().isOk()); 

    assertNotEquals(sampleUser.getName(), userRepository.findOne(sampleUser.getId()).getName()); 
    assertEquals(userNameAfterUpdate, userRepository.findOne(sampleUser.getId()).getName()); 
} 

입니다. 나는 사용자 객체를 찾아서 얻는다. 및 mockMvc.perform(). ID로 사용자를 찾아서 업데이트합니다.

하지만 동일한 개체가 표시됩니다. mockMvc는 sampleUser 객체를 업데이트합니다. 그래서 assertNotEquals 테스트가 실패합니다.

어떻게 일어 났습니까? 누군가 도와주세요.

+0

일반적으로 데이터 소스뿐만 아니라 @Transactional, 트랜잭션을 사용하는 위치에 대한 추가 정보를 제공 할 수 있습니까? –

답변

0

이것은 트랜잭션의 영향입니다. 하나의 트랜잭션 (T1)에서 사용을로드합니다.

그런 다음 MockMvc를 통해 다른 트랜잭션 (T2)을 수행하여 사용자를 변경합니다.

그러나 테스트는 여전히 트랜잭션 T1에 있으며 변경 사항을 볼 수 없습니다. 실제로 JPA의 동작으로 인해 데이터베이스에 액세스하지 않고 엔티티 관리자로부터 가져옵니다.

테스트에서 "수정"하는 쉬운 방법은 없습니다. 두 개 이상의 개별 테스트에서 테스트를 분할하는 것이 좋습니다.

MVC 설정을 확인하는 하나의 테스트에서 올바른 메서드가 호출되고 예상 된 HTTP 상태 코드와 내용이 반환되는지 확인합니다.

메서드가 실제로 엔터티에 예상되는 변경 사항을 수행하고 리포지토리를 호출하는지 확인하는 별도의 테스트입니다.

두 테스트 모두 틀림없이 조롱 된 저장소를 사용해야합니다.