Spring MockMvcを使用していくつかのHTTP動詞を持つコントローラをテストしようとしています。現在GET
とDELETE
は期待どおりに動作しますが、PUT
とPATCH
は、そうしなければならない場合は201に戻りません。次のようにSpring MockMvcは201の代わりに200を返しています。デバッグの方法は?
PATCH
コントローラが設定され:
@CustomRequestMapping(method = PATCH, value = "/{api-root}")
public ResponseEntity patch(@PathVariable(value = "api-root") String id, @RequestBody ApiRoot apiRoot) {
return apiRootService.softUpdate(id, apiRoot);
}
@CustomRequestMapping...
注釈は単に特定のコンテンツタイプであることがconsumes
とproduces
設定します。
上記参照softUpdate()
方法は、以下を実行する:
public ResponseEntity softUpdate(String id, ApiRoot apiRoot) {
if (apiRoot.getId() == null) {
apiRoot.setId(id);
}
ApiRootDocument updated = softUpdate(apiRoot);
return ResponseEntity
.created(EscapeUtil.buildUrl(applicationProperties.getHostname(), applicationProperties.getPort(), id))
.body(updated);
}
これは作業とMockMvcユニットテストの外試験されます。それは201 Created
をPostmanに返します。本体はPATCH
の結果として作成された新しいJSONオブジェクトです。代わりに201
の、返される200
になり
public void testPatchApiRootEndpoint() throws Exception {
String testTitle = "New Test Title";
// Mock the service call for softUpdate() to return 'created' in the same way that the method does
when(apiRootService.softUpdate(TestData.apiRoot1.getId(), TestData.apiRoot1.withTitle(testTitle)))
.thenReturn(ResponseEntity
.created(URI.create(EscapeUtil.buildUrlString("localhost", "8001", TestData.apiRoot1.getId())))
.body((ApiRootDocument) TestData.apiRoot1.withTitle(testTitle)));
// Perform a patch update using a new title provided as key-value
JsonObject titleJson = new JsonObject();
titleJson.addProperty("title", testTitle);
mockMvc.perform(patch("/{api-root}", TestData.apiRoot1.getId())
.contentType(Constants.TAXII2_CONTENT_TYPE)
.content(titleJson.toString()))
.andExpect(status().isCreated());
}
:
私のテストでは、などの設定です。私は本当に混乱しており、研究することは困難でした。最も似た問題は、2XXが必要なときに4XX応答コードを見つけることであり、その解決策は一般的に要求の設定と関係しています。
私が見つけるように見えることができる唯一の興味深いログは、次のとおりです。あなたの嘲笑呼び出しは働いていないよう
09:48:25.064 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Servlet '' configured successfully
09:48:25.208 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - DispatcherServlet with name '' processing PATCH request for [/api-root-1]
09:48:25.211 [main] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Looking up handler method for path /api-root-1
09:48:25.219 [main] DEBUG org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Returning handler method [public org.springframework.http.ResponseEntity xor.bcmc.flarecloud.apiroot.controller.ApiRootController.patch(java.lang.String,xor.bcmc.taxii2.resources.ApiRoot)]
09:48:25.388 [main] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor - Read [class xor.bcmc.taxii2.resources.ApiRoot] as "application/vnd.oasis.taxii+json;version=2.0" with [org.springfr[email protected]20921b9b]
09:48:25.428 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Null ModelAndView returned to DispatcherServlet with name '': assuming HandlerAdapter completed request handling
09:48:25.428 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - Successfully completed request
おかげです、これは本当にうまくいったのですが、なぜMockitoとSpringが渡される実際のパラメータ値を検出できないのか不思議です。とにかく、それは動作し、必要なコードをカバーするので、私はそれを取るでしょう。 –
'Mockito.any()'は私の例では簡単にチェックするためのものですが、実際には実際の値を確認する必要があります。例えば 'Mockito.eq(TestData.apiRoot1.getId())' – borino