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})
我未能使用路径变量测试 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})