Spring MVC RestController 测试未能找到有效映射

Spring MVC RestController test failed to find valid mapping

我未能使用路径变量测试 RestController 方法

INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/my/{env}] onto handler 'myController'
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/my/{env}.*] onto handler 'myController'
INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/my/{env}/] onto handler 'myController'
INFO org.springframework.test.web.servlet.TestDispatcherServlet - FrameworkServlet '': initialization completed in 205 ms
WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/my/dev/auth] in DispatcherServlet with name ''

我的测试

@ContextConfiguration( classes = {Config.class, MyController.class})
@ActiveProfiles(profiles= {"dev"})
@WebAppConfiguration
public class MyControllerTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;


    @BeforeClass
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testAuth() throws Exception {
        MockHttpSession httpSession =  new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());
        MockHttpServletRequestBuilder mockHttpServletRequestBuilder = MockMvcRequestBuilders
        .post("/my/dev/auth").content("<XML></XML>")
        .session(httpSession)
        .contentType(MediaType.APPLICATION_XML);
         MvcResult mvcResult = this.mockMvc.perform(mockHttpServletRequestBuilder)
                  .andDo(MockMvcResultHandlers.print())
                  .andReturn(); 

我的控制器

@RestController
@RequestMapping(value = "/my/{env}")
public class MyController {

@PostMapping(value = "auth", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
    public @ResponseBody ResponseEntity<Response> authenticate(
            @PathVariable("env") String gameEnvironment, @RequestBody String xml,
            HttpServletRequest httpRequest) {

编辑

删除路径变量会产生类似的结果

[main] INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/my] onto handler 'myController'
[main] INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/my.*] onto handler 'myController'
[main] INFO org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping - Mapped URL path [/my/] onto handler 'myController'
[main] WARN org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/my/auth] in DispatcherServlet with name ''

以下适用于 JUnit 4。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { Config.class, MyController.class })
@ActiveProfiles("dev")
@WebAppConfiguration("classpath:META-INF/web-resources")
public class MyControllerTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;


    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testAuth() throws Exception {
        MockHttpSession httpSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());

        this.mockMvc.perform(
                post("/my/dev/auth")
                    .content("<XML></XML>")
                    .session(httpSession)
                    .contentType(MediaType.APPLICATION_XML))
            .andDo(print())
            .andExpect(status().isOk());
    }

}

@Configuration
@EnableWebMvc
class Config {
}

@RestController
@RequestMapping("/my/{env}")
class MyController {

    @PostMapping(path = "auth", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
    public String authenticate(@PathVariable("env") String env, @RequestBody String xml,
            HttpServletRequest httpRequest) {

        return null;
    }
}

以下适用于 TestNG。

@ContextConfiguration(classes = { Config.class, MyController.class })
@ActiveProfiles("dev")
@WebAppConfiguration("classpath:META-INF/web-resources")
public class MyControllerTestNG extends AbstractTestNGSpringContextTests {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;


    @BeforeClass
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void testAuth() throws Exception {
        MockHttpSession httpSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());

        this.mockMvc.perform(
                post("/my/dev/auth")
                    .content("<XML></XML>")
                    .session(httpSession)
                    .contentType(MediaType.APPLICATION_XML))
            .andDo(print())
            .andExpect(status().isOk());
    }

}

缺少完整加载相关配置的测试类

@ContextConfiguration( classes = {Config.class, MyController.class
    ,OtherConfig.class})