2017-05-19 5 views
0

Im은 내 Spring REST 컨트롤러를 테스트하려고하지만 내 @Service은 항상 DB에 연결하려고합니다.시험 중 의심스러운 @Service가 데이터베이스에 연결

컨트롤러 :

@RestController 
@RequestMapping(value = "/api/v1/users") 
public class UserController { 

private UserService userService; 

@Autowired 
public UserController(UserService userService) { 
    this.userService = userService; 
} 

@RequestMapping(method = RequestMethod.GET) 
public ResponseEntity<List<User>> getAllUsers() { 
    List<User> users = userService.findAll(); 
    if (users.isEmpty()) { 
     return new ResponseEntity<List<User>>(HttpStatus.NO_CONTENT); 
    } 

    return new ResponseEntity<List<User>>(users, HttpStatus.OK); 
} 

테스트 : 대신 복귀로 firstsecond을 받고,이 DB에서 데이터를 읽기 때문에 항상 실패

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = Application.class) 
@WebAppConfiguration 
public class UserControllerTest { 

private MockMvc mockMvc; 

@Autowired 
private WebApplicationContext wac; 

@Before 
public void setup() { 
    this.mockMvc = webAppContextSetup(wac).build(); 
} 

@Test 
public void getAll_IfFound_ShouldReturnFoundUsers() throws Exception { 
    User first = new User(); 
    first.setUserId(1); 
    first.setUsername("test"); 
    first.setPassword("test"); 
    first.setEmail("[email protected]"); 
    first.setBirthday(LocalDate.parse("1996-04-30")); 

    User second = new User(); 
    second.setUserId(2); 
    second.setUsername("test2"); 
    second.setPassword("test2"); 
    second.setEmail("[email protected]"); 
    second.setBirthday(LocalDate.parse("1996-04-30")); 

    UserService userServiceMock = Mockito.mock(UserService.class); 

    Mockito.when(userServiceMock.findAll()).thenReturn(Arrays.asList(first, second)); 

    mockMvc.perform(get("/api/v1/users")). 
      andExpect(status().isOk()). 
      andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)). 
      andExpect(jsonPath("$", hasSize(2))). 
      andExpect(jsonPath("$[0].userId", is(1))). 
      andExpect(jsonPath("$[0].username", is("test"))). 
      andExpect(jsonPath("$[0].password", is("test"))). 
      andExpect(jsonPath("$[0].email", is("[email protected]"))). 
      andExpect(jsonPath("$[0].email", is(LocalDate.parse("1996-04-30")))). 
      andExpect(jsonPath("$[1].userId", is(2))). 
      andExpect(jsonPath("$[1].username", is("test2"))). 
      andExpect(jsonPath("$[1].password", is("test2"))). 
      andExpect(jsonPath("$[1].email", is("[email protected]"))). 
      andExpect(jsonPath("$[1].email", is(LocalDate.parse("1996-04-30")))); 

    verify(userServiceMock, times(1)).findAll(); 
    verifyNoMoreInteractions(userServiceMock); 
} 
} 

내 테스트. DB를 끄면 NestedServletException, nested: DataAccessResourceFailureException이 발생합니다.

어떻게 제대로 테스트 할 수 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

당신은 아무것도 조롱하지 않습니다 ... 귀하의 응용 프로그램은 여전히 ​​실제 서비스를 사용합니다. 모의 실험을하려면 테스트에서'UserService' 타입의 필드를 만들고'@MockBean'으로 주석을 달고 (수동 모의 생성을 제거하십시오.) 수동으로'MockMvc'을'@ Autowired '로 만들고 대신 스프링 부트 테스트 지원이 당신을 위해 그것을 처리합니다. –

답변

1

이렇게하면 UserService userServiceMock = Mockito.mock(UserService.class);은 userService를 조롱하여 컨트롤러에 삽입하지 않습니다. 이 줄을 제거하고

@MockBean UserService userServiceMock; 

을 다음과 같이 M.Deinum이 코드가

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = Application.class) 
@WebAppConfiguration 
public class UserControllerTest { 

    @MockBean 
    UserService userServiceMock; 

    @Autowired 
    private MockMvc mockMvc; 

    @Test 
    public void getAll_IfFound_ShouldReturnFoundUsers() throws Exception { 
     User first = new User(); 
     first.setUserId(1); 
     first.setUsername("test"); 
     first.setPassword("test"); 
     first.setEmail("[email protected]"); 
     first.setBirthday(LocalDate.parse("1996-04-30")); 

     User second = new User(); 
     second.setUserId(2); 
     second.setUsername("test2"); 
     second.setPassword("test2"); 
     second.setEmail("[email protected]"); 
     second.setBirthday(LocalDate.parse("1996-04-30")); 

     Mockito.when(userServiceMock.findAll()) 
      .thenReturn(Arrays.asList(first, second)); 

     mockMvc.perform(get("/api/v1/users")). 
     andExpect(status().isOk()). 
     andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)). 
     andExpect(jsonPath("$", hasSize(2))). 
     andExpect(jsonPath("$[0].userId", is(1))). 
     andExpect(jsonPath("$[0].username", is("test"))). 
     andExpect(jsonPath("$[0].password", is("test"))). 
     andExpect(jsonPath("$[0].email", is("[email protected]"))). 
     andExpect(jsonPath("$[0].email", is(LocalDate.parse("1996-04-30")))). 
     andExpect(jsonPath("$[1].userId", is(2))). 
     andExpect(jsonPath("$[1].username", is("test2"))). 
     andExpect(jsonPath("$[1].password", is("test2"))). 
     andExpect(jsonPath("$[1].email", is("[email protected]"))). 
     andExpect(jsonPath("$[1].email", is(LocalDate.parse("1996-04-30")))); 

     verify(userServiceMock, times(1)).findAll(); 
     verifyNoMoreInteractions(userServiceMock); 
    } 
} 
과 같아야 당신이 MockMvc의 수동 생성을 제거 할 수 있습니다 제안하고 마지막에

@Autowired 
private MockMvc mockMvc; 

를 autowire가 @으로 userService를 주입