2017-10-09 28 views
2

Spring Web MVCテストでJUnit4を使用していて、コントローラ用のテストクラスがあります。Spring 5.0.0 MockMvc:MediaTypeが正しく設定されていてもサポートされていないメディアタイプ

コントローラは、JSON本体のコンテンツで「/ test」するPOSTリクエストを処理します。私は手動でPostmanを使用してこのメ​​ソッドをテストしましたが、 "name"プロパティが空であるため、期待通りに400 Bad Requestレスポンスを取得します。私は私のテストクラスを介して私のコントローラに同じ要求を送信するとき

POST /Server/test HTTP/1.1 
Host: localhost:8080 
Content-Type: application/json 
Cache-Control: no-cache 

{ 
    "name": "" 
} 

はしかし、私は、要求が同じであっても、415(サポートされていないメディアタイプ)エラーが発生します。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
@WebAppConfiguration 
public class MyControllerTest { 

@Configuration 
public static class MyControllerTestConfiguration { 

    @Bean 
    public MyController myController() { 
     return new MyController(); 
    } 
} 

private MockMvc mockMvc; 

@Before 
public void setup() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
} 

@Test 
public void shouldReturnBadRequest_IfBodyIsEmpty() throws Exception { 
    // Works fine 
    mockMvc.perform(post("/test")) 
      .andExpect(status().isBadRequest()); 
} 

@Test 
public void shouldReturnBadRequest_IfInvalidFields() throws Exception { 

    MyDTO dto = new MyDTO(); 
    dto.setName(""); 

    // Jackson object mapper 
    ObjectMapper mapper = new ObjectMapper(); 

    // TEST FAIL: Gets 415 error 
    mockMvc.perform(
       post("/test") 
       .content(mapper.writeValueAsString(dto)) 
       .characterEncoding("UTF-8") 
       .contentType(MediaType.APPLICATION_JSON) 
      ) 
      .andDo(print()) 
      .andExpect(status().isBadRequest()); 
    } 
} 

ここにMyControllerがあります。

@RestController 
@EnableWebMvc 
public class MyController { 

    @RequestMapping(value = "/test", method = RequestMethod.POST) 
    public void init(@javax.validation.Valid @RequestBody MyDTO dto) { 
    } 

    @ExceptionHandler(MethodArgumentNotValidException.class) 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    @ResponseBody 
    public void validationError(MethodArgumentNotValidException ex) { 
    } 
} 

ここにMyDTOがあります。

@lombok.Data 
public class MyDTO { 
    private String name; 
} 

私はジャクソンも私の依存関係にあります。ここで

は、それがコンソールに出力されますと、テストクラスの要求は次のようになります。とにかく

MockHttpServletRequest: 
     HTTP Method = POST 
     Request URI = /test 
     Parameters = {} 
      Headers = {Content-Type=[application/json;charset=UTF-8]} 
      Body = {"name":""} 
    Session Attrs = {} 

Handler: 
      Type = controller.MyController 
      Method = public void controller.MyController.init(dto.MyDTO) 

Async: 
    Async started = false 
    Async result = null 

Resolved Exception: 
      Type = org.springframework.web.HttpMediaTypeNotSupportedException 

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

FlashMap: 
     Attributes = null 

MockHttpServletResponse: 
      Status = 415 
    Error message = null 
      Headers = {Accept=[application/octet-stream, text/plain, application/xml, text/xml, application/x-www-form-urlencoded, application/*+xml, multipart/form-data, */*]} 
    Content type = null 
      Body = 
    Forwarded URL = null 
    Redirected URL = null 
      Cookies = [] 

、なぜ私はこのエラーを取得するのでしょうか?要求は私には完璧に見えます。どんな助けもありがとうございます。ありがとう。

+0

'.characterEncoding(" UTF-8 ")'を省略すると、テストが415を返すかどうかを教えてもらえますか? –

+0

@AlehMaksimovichええ、それはまだありません。 –

+0

'MockHttpServletResponse'' Headers = {Accept = [application/octet-stream、...]} 'には' application/json'は含まれていません。おそらく、テストクラスパス(ランタイム依存関係?)にJacksonや他のSpringがサポートしているJSONライブラリを持っていないかもしれません。 Springは、変換を実行するMIMEタイプに関連付けられたHttpMessageConverterを特に検索します。 jacksonがクラスパス上にある場合、SpringブートはMappingJackson2MessageConverterを自動的に設定します。 –

答えて

3

私はMyControllerTestConfiguration内部静的クラスに@EnableWebMvcを注釈を付けることでこの問題を解決しました。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
@WebAppConfiguration 
public class MyControllerTest { 

    @Configuration 
    @EnableWebMvc // <------------ added this 
    public static class MyControllerTestConfiguration { 

     @Bean 
     public SetupController setupController() { 
      return new MyController(); 
     } 

    } 
関連する問題