2017-12-11 24 views
2

delete 메소드를 포함한 컨트롤러 메소드를 테스트해야합니다. 여기에 일부 컨트롤러 코드 : 콘솔 로그에서봄 MockMvc - REST 컨트롤러의 삭제 요청을 테스트하는 방법?

java.lang.AssertionError: Status Expected :200 Actual :400

내가이 발견 : 잘못된 상태 코드 때문에 실패와

@InjectMocks 
private FooController fooController; 

@Before 
public void setUp() { 
    this.mockMvc = MockMvcBuilders.standaloneSetup(fooController) 
.setControllerAdvice(new ExceptionHandler()).alwaysExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")).build(); 
} 

@Test 
public void testFooDelete() throws Exception { 
    this.mockMvc.perform(MockMvcRequestBuilders 
      .delete("/api/foo") 
      .param("id", "11") 
      .contentType(MediaType.APPLICATION_JSON)) 
      .accept(MediaType.APPLICATION_JSON)) 
      .andExpect(status().isOk()); 
} 

시험 마무리 : 여기

@RestController 
@RequestMapping("/api/foo") 
public class FooController { 

    @Autowired 
    private FooService fooService; 

    // other methods which works fine in tests 

    @RequestMapping(path="/{id}", method = RequestMethod.DELETE) 
    public void delete(@PathVariable Long id) { 
     fooService.delete(id); 
    }  
} 

그리고 나의 테스트입니다 :

2017-12-11 20:11:01 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - DispatcherServlet with name '' processing DELETE request for [/api/foo] 
2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /api/foo 
2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 
2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Invoking @ExceptionHandler method: public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> cz.ita.javaee.web.controller.error.ExceptionHandler.handleException(java.lang.Exception) 
2017-12-11 20:11:01 [main] DEBUG o.s.w.s.m.m.a.HttpEntityMethodProcessor - Written [{stackTrace=org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 

어떻게 고칠 수 있는지 말해 줄 수 있니? 감사.

+1

내가 PARAM 생각하지 않습니다() 메소드는 API가 그것을 가지고 같은 경로 변수를 넣어하는 것과 같습니다, 하지만 확실하지 않습니다. 다른 말로하면 테스트가 수행하는 호출이/api/foo/11 대신/api/foo? id = 11과 같다고 생각합니다. 그래도 추측 일뿐입니다. – AHungerArtist

+0

@HungerArtist 변경했지만 동일한 오류가 발생했습니다. –

답변

2

대상 URI는 다음과 같습니다. /api/foo 및이 경로 변수를 기반으로 /api/foo/11 :이 경로 변수는 /{id}입니다.

과 같이 MockMvc 당신이 설정 한 경로 변수 (일명 URI 변수)를 사용하여 :

delete(uri, uriVars) 

자세한 내용 in the Javadocs합니다.

그래서, 테스트 읽어야합니다 택일

@Test 
public void testFooDelete() throws Exception { 
    this.mockMvc.perform(MockMvcRequestBuilders 
      .delete("/api/foo/{id}", "11") 
      .contentType(MediaType.APPLICATION_JSON)) 
      .accept(MediaType.APPLICATION_JSON)) 
      .andExpect(status().isOk()); 
} 

또는를 :

@Test 
public void testFooDelete() throws Exception { 
    this.mockMvc.perform(MockMvcRequestBuilders 
      .delete("/api/foo/11") 
      .contentType(MediaType.APPLICATION_JSON)) 
      .accept(MediaType.APPLICATION_JSON)) 
      .andExpect(status().isOk()); 
} 
+0

그것이 작동 :) 감사합니다 많이. –