2017-12-18 8 views
0

Spring MockMvcを使用していくつかのHTTP動詞を持つコントローラをテストしようとしています。現在GETDELETEは期待どおりに動作しますが、PUTPATCHは、そうしなければならない場合は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...注釈は単に特定のコンテンツタイプであることがconsumesproduces設定します。

上記参照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 

答えて

1

が見えます。あなたが任意の()に値を交換する場合は、簡単に確認できます。

when(apiRootService.softUpdate(Mockito.any(), Mockito.any()) 
.thenReturn(ResponseEntity 
       .created(URI.create(EscapeUtil.buildUrlString("localhost", "8001", TestData.apiRoot1.getId()))) 
       .body((ApiRootDocument) TestData.apiRoot1.withTitle(testTitle))); 

あなたが200のステータスが返され、コントローラから間違ったモックを使用している場合、私はちょうどチェックしますが、モックが正しければ、私は201

+0

おかげです、これは本当にうまくいったのですが、なぜMockitoとSpringが渡される実際のパラメータ値を検出できないのか不思議です。とにかく、それは動作し、必要なコードをカバーするので、私はそれを取るでしょう。 –

+0

'Mockito.any()'は私の例では簡単にチェックするためのものですが、実際には実際の値を確認する必要があります。例えば 'Mockito.eq(TestData.apiRoot1.getId())' – borino

関連する問題