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を受け入れます。そのため、ドキュメントは少なくとも動作しています。
これはなぜですか?