2016-09-15 24 views
0

Spring HATEOASを使用してサービスを作成し、mockmvcを使用してテストした後(Spring restdocsを使用してドキュメントを生成する場合)、次が見つかりました。Spring HATEOASとmockMVCは、consumes = MediaType.APPLICATION_JSON_UTF8_VALUEを無視します。

@Test 
public void addMy() throws Exception { 
    this.mockMvc.perform(post("/v1/my") 
      .content("{ \"myId\": 9911 }") 
      .contentType(MediaType.APPLICATION_JSON_UTF8) 
      .accept(MediaTypes.HAL_JSON)) 
      .andExpect(status().isCreated()) 
      .andExpect(MockMvcResultMatchers.jsonPath("$.myId").value(9911)) 
      .andDo(this.document.document(selfLinkSnippet, responseFieldsSnippet)); 
} 

我々が得るユニットテスト結果は次のとおりです:

java.lang.AssertionError: Status 
Expected :201 
Actual :415 

ステータス

@RestController 
@RequestMapping("/v1/my") 
@ExposesResourceFor(My.class) 
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL) 
public class MyController { 

    @Autowired 
    private MyRepository myRepository; 

    @Autowired 
    private MyResourceAssembler myResourceAssembler; 

    @RequestMapping(path = "", method = POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) 
    public HttpEntity<Resource<MyResource>> addMy(
     @RequestBody MyResource newMyResource) { 

    if (myRepository.existsByMyId(newMyResource.getMyId())) { 
     return new ResponseEntity<>(HttpStatus.CONFLICT); 
    } 

    val newMy = new My(
      null, // generates id 
      newMy.getMyId() 
    ); 

    val myResource = myResourceAssembler.toResource(myRepository.save(newMy)); 
    val resource = new Resource<>(myResource); 

    return new ResponseEntity<>(resource, HttpStatus.CREATED); 
    } 
} 

は、我々が作成した次のテストをこれをテストするには:

当社RestControllerは何かのように見えますコード415はサポートされていないメディアタイプです。

私たちが言うには、ユニットテストを変更する場合:

.contentType(MediaTypes.HAL_JSON) 

ユニットテストを返す成功。アプリケーション/ jsonだけを消費すると指定して以来、これは奇妙です。 問題は今に生成されるドキュメントは、間違ってPOSTリクエストがコンテンツタイプapplication/HAL + JSONを使用する必要があると述べているということです。

curl 'http://my-service/v1/my' -i -X POST -H 'Content-Type: application/hal+json' -H 'Accept: application/hal+json' -d '{ "myId": 9911 }' 

そして、あなたがいることをしようとした場合、あなたは別の415 の場合を取得します私たちはContent-Type:をapplication/jsonに変更します。それはうまくいきます。

我々はHAL + JSONとJSONの両方を消費する方法を教えてくれた場合:

@RequestMapping(path = "", method = POST, consumes = { MediaTypes.HAL_JSON_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE}) 

のcontentType(MediaTypes.HAL_JSON)が設定されている場合、その後、ユニットテストは成功しますが、contentTypeの(MediaType.APPLICATION_JSON_UTF8)である場合に失敗しますセット。

ただし、サービスは両方とも、アプリケーション/ json AND application/hal + jsonを受け入れます。そのため、ドキュメントは少なくとも動作しています。

これはなぜですか?

答えて

0

私は別のstackoverflowの質問が見つかりました:Spring MVC controller ignores "consumes" property

をそしてそこに解決策は、同様に私のために働きました。 @EnableWebMvcをテスト構成クラスに追加しました。

@EnableWebMvc 
@Configuration 
@Import({CommonTestConfiguration.class}) 
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL) 
public class MyControllerTestConfiguration { 

    @Bean 
    public MyRepository myRepository() { 

     return new InMemoryMyRepository(); 
    } 

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

    @Bean 
    public MyResourceAssembler myResourceAssembler() { 
     return new myResourceAssembler(); 
    } 
} 
関連する問題