2015-10-30 14 views
6

を「コンテンツタイプ設定されていません」:、私はポストマンを使用して、それを呼び出すと、私は「キー」パラメータを送信しない場合は私はこの1つに似レストコントローラがある場合ユニットテスト春RESTfulなコントローラ

@RestController 
public class UserRestController { 

    @Autowired 
    private UserService userService; 

    @RequestMapping(value = "/user/activate", method = RequestMethod.POST) 
    public ResponseEntity<UserDTO> activate(
      @RequestParam(required = true) final String email, 
      @RequestParam(required = true) final String key) { 

     UserDTO userDTO = userService.activateAccount(email, key); 
     return new ResponseEntity<UserDTO>(userDTO, HttpStatus.OK); 
    } 
} 

を私はこのJSONメッセージを受け取ります:

{ 
    "timestamp": 1446211575193, 
    "status": 400, 
    "error": "Bad Request", 
    "exception": "org.springframework.web.bind.MissingServletRequestParameterException", 
    "message": "Required String parameter 'key' is not present", 
    "path": "/user/activate" 
} 

一方、私はこのメソッドをJUnitとMockMVC Springユーティリティでテストしています。

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = ApplicationConfig.class) 
@WebAppConfiguration 
public class UserRestControllerTest { 

    private static MockMvc mockMvc; 

    @Mock 
    private UserService userService; 

    @InjectMocks 
    private UserRestController userRestController; 

    @Before 
    public void setup() { 

     MockitoAnnotations.initMocks(this); 
     mockMvc = MockMvcBuilders 
       .standaloneSetup(userRestController) 
       .setMessageConverters(
         new MappingJackson2HttpMessageConverter(), 
         new Jaxb2RootElementHttpMessageConverter()).build(); 

    } 

    @Test 
    public void testActivateRequiredParams() throws Exception { 

     mockMvc.perform(
       MockMvcRequestBuilders.post("/user/activate") 
       .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
       .accept(MediaType.APPLICATION_JSON)) 
       .andDo(MockMvcResultHandlers.print()) 
       .andExpect(MockMvcResultMatchers.status().isBadRequest()) 
       .andExpect(
         MockMvcResultMatchers.content().contentType(
           UtilsUnitTest.APPLICATION_JSON_UTF8)) 
       .andExpect(
         jsonPath(
           "message", 
           is("Required String parameter 'email' is not present"))); 

    } 
} 

しかし、このテストを実行すると、応答がJSONメッセージではないことがわかります。

MockHttpServletRequest: 
     HTTP Method = POST 
     Request URI = /user/activate 
      Parameters = {} 
      Headers = {Content-Type=[application/x-www-form-urlencoded]} 

      Handler: 
       Type = com.company.controller.UserRestController 
       Method = public org.springframework.http.ResponseEntity<com.company.dto.UserDTO> com.company.controller.UserRestController.activate(java.lang.String,java.lang.String) 

       Async: 
     Async started = false 
     Async result = null 

    Resolved Exception: 
       Type = org.springframework.web.bind.MissingServletRequestParameterException 

     ModelAndView: 
      View name = null 
       View = null 
       Model = null 

      FlashMap: 

MockHttpServletResponse: 
       Status = 400 
     Error message = Required String parameter 'email' is not present 
      Headers = {} 
     Content type = null 
       Body = 
     Forwarded URL = null 
     Redirected URL = null 
      Cookies = [] 

私は例外がスローされたとき、これはJSON形式に変換されていないことを推測する(私は正しいJSONの結果を得る

java.lang.AssertionError: Content type not set

特に、完成した結果は次のとおりです。実際、私は例外を取得します

質問が明らかな場合:例外が発生した場合にJSONエラーメッセージが表示されるようにユニットテストの設定を変更するにはどうすればよいですか?

答えて

0

問題はテストアサーションが失敗し、次の後に停止していることである。このほかに

.andExpect(MockMvcResultMatchers.content().contentType(UtilsUnitTest.APPLICATION_JSON_UTF8)) 

を、jsonPath("message"...は何もヒットしません。返されたエラーメッセージを検証するには、MockMvcResultMatchers.status().reason(<ResultMatcher>)を使用します。

@Test 
public void testActivateRequiredParams() throws Exception { 
    final ResultActions result = mockMvc 
      .perform(MockMvcRequestBuilders.post("/user/activate") 
        .contentType(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON)) 
      .andDo(MockMvcResultHandlers.print()); 
    result.andExpect(MockMvcResultMatchers.status().isBadRequest()); 
    result.andExpect(MockMvcResultMatchers.status().reason(is("Required String parameter 'email' is not present"))); 
} 

をしかし、この(エラーメッセージのテストが)一般的には良い考えであれば、多分this discussionを参照してください考える:

次のテストは、仕事をする必要があります。

関連する問題