4

私が実行しているMockMvcで単体テストを作成する:

HttpRequestMethodNotSupportedException: リクエスト メソッド 'POST' はサポートされていません

これにより、テスト ケースは「200」を予期して失敗し、「405」を取得します。Junit に表示される可能性のある追加事項のいくつかは、Spring Rest ドキュメント用であり、無視できます。@Rule や mockMvc Call の .andDo() など。次のドキュメントSpring Rest Docs - Path Parameterに従っていますが、機能していないようです。

コントローラーは次のとおりです。

@RestController("/transferObjects")
public class TransferObjectController {

    @RequestMapping(method=RequestMethod.GET, produces="application/json")
    public List<TransferObject> getTransferObjects(){
        // do some magic
        return null;
    }

    @RequestMapping(value = "/{name}", method=RequestMethod.POST)
    @ResponseStatus(HttpStatus.OK)
    public void addTransferObject(@PathVariable("name")String name){
        // do magic
    }

    @RequestMapping(value = "/{name}", method=RequestMethod.DELETE)
    @ResponseStatus(HttpStatus.OK)
    public void deleteTransferObject(@PathVariable("name")String name){
        // do magic
    }

Junit クラスは次のとおりです。

public class TransferObjectControllerTest {

@Rule
public RestDocumentation restDocumentation = new RestDocumentation("target/generated-snippets");

private MockMvc mockMvc;

@Before
public void setUp() throws Exception {      
    this.mockMvc = MockMvcBuilders.standaloneSetup(new TransferObjectController())
            .apply(documentationConfiguration(this.restDocumentation))
            .build();
}

@Test
public void testAddTransferObject() throws Exception {
    this.mockMvc.perform(post("/transferObjects/{name}", "hi"))
        .andExpect(status().isOk()).andDo(document("transferObject",
                pathParameters(
                    parameterWithName("name").description("The name of the new Transfer Object to be created."))));
}

テスト実行中のコンソールは次のとおりです。

11:20:48.148 [main] INFO  o.s.w.s.m.m.a.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.test.web.servlet.setup.StubWebApplicationContext@5ab785fe
    11:20:48.205 [main] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Looking for exception mappings: org.springframework.test.web.servlet.setup.StubWebApplicationContext@5ab785fe
    11:20:48.283 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Initializing servlet ''
    11:20:48.307 [main] DEBUG o.s.w.c.s.StandardServletEnvironment - Adding [servletConfigInitParams] PropertySource with lowest search precedence
    11:20:48.307 [main] DEBUG o.s.w.c.s.StandardServletEnvironment - Adding [servletContextInitParams] PropertySource with lowest search precedence
    11:20:48.312 [main] DEBUG o.s.w.c.s.StandardServletEnvironment - Adding [systemProperties] PropertySource with lowest search precedence
    11:20:48.312 [main] DEBUG o.s.w.c.s.StandardServletEnvironment - Adding [systemEnvironment] PropertySource with lowest search precedence
    11:20:48.313 [main] DEBUG o.s.w.c.s.StandardServletEnvironment - Initialized StandardServletEnvironment with PropertySources [servletConfigInitParams,servletContextInitParams,systemProperties,systemEnvironment]
    11:20:48.313 [main] INFO  o.s.mock.web.MockServletContext - Initializing Spring FrameworkServlet ''
    11:20:48.313 [main] INFO  o.s.t.w.s.TestDispatcherServlet - FrameworkServlet '': initialization started
    11:20:48.318 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Unable to locate MultipartResolver with name 'multipartResolver': no multipart request handling provided
    11:20:48.318 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Using LocaleResolver [org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@63238bf4]
    11:20:48.318 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Using ThemeResolver [org.springframework.web.servlet.theme.FixedThemeResolver@32b97305]
    11:20:48.319 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Using RequestToViewNameTranslator [org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@2d2e6747]
    11:20:48.319 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Using FlashMapManager [org.springframework.web.servlet.support.SessionFlashMapManager@417e7d7d]
    11:20:48.319 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Published WebApplicationContext of servlet '' as ServletContext attribute with name [org.springframework.web.servlet.FrameworkServlet.CONTEXT.]
    11:20:48.319 [main] INFO  o.s.t.w.s.TestDispatcherServlet - FrameworkServlet '': initialization completed in 6 ms
    11:20:48.319 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Servlet '' configured successfully
    11:20:48.361 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - DispatcherServlet with name '' processing POST request for [/transferObjects/hi]
    11:20:48.364 [main] DEBUG o.s.t.w.s.s.StandaloneMockMvcBuilder$StaticRequestMappingHandlerMapping - Looking up handler method for path /transferObjects/hi
    11:20:48.368 [main] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
    11:20:48.369 [main] DEBUG o.s.w.s.m.a.ResponseStatusExceptionResolver - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
    11:20:48.369 [main] DEBUG o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
    11:20:48.369 [main] WARN  o.s.web.servlet.PageNotFound - Request method 'POST' not supported
    11:20:48.370 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Null ModelAndView returned to DispatcherServlet with name '': assuming HandlerAdapter completed request handling
    11:20:48.370 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Successfully completed request
4

1 に答える 1

2

この問題を修正できたようです。

テストの実行中にコンソールを詳しく見てみると、次のことに気付きました。

Mapped "{[],methods=[GET],produces=[application/json]}" onto public java.util.List<common.to.TransferObject> sf.common.controller.TransferObjectController.getTransferObjects()
Mapped "{[/{name}],methods=[POST]}" onto public void sf.common.controller.TransferObjectController.addTransferObject(java.lang.String)
Mapped "{[/{name}],methods=[DELETE]}" onto public void sf.common.controller.TransferObjectController.deleteTransferObject(java.lang.String)

これは、コントローラーのリクエスト マッピングをメソッドが保持する特定の RequestMapping にマッピングしていることを示しています。@RestController("/transferObjects")実際にはマッピングを親として定義していません。@RequestMapping("/transferObjects")そのためには、の下に含める必要があります@RestController

したがって、親マッピングを変更することで、次のテスト ケースを使用できるようになりました。

@Test
public void testAddTransferObject() throws Exception {
    this.mockMvc.perform(post("/transferObjects/{name}", "hi"))
        .andExpect(status().isOk()).andDo(document("transferObject",
                pathParameters(
                    parameterWithName("name").description("The name of the new Transfer Object to be created."))));
}
于 2016-01-25T19:13:45.317 に答える