Spring MockMvc失败:找不到带URI的HTTP请求的映射

时间:2018-04-20 11:05:14

标签: spring unit-testing spring-boot servlets spring-test-mvc

我的REST API中有一个GET方法

这是我的控制器类

@RestController
@RequestMapping("/api")
@Validated
public class ApiController {

@Autowired
private ApiService service;

@GetMapping(path = { "/check/{type}", "/check" }, 
produces= {MediaType.APPLICATION_JSON_UTF8_VALUE,MediaType.APPLICATION_XML_VALUE})
    public List<Myobject> check(@MyConstraint @RequestParam("email") final List<String> emails,
            @PathVariable(name = "type", required = false) final String type) {
        final String subscriptiontype = StringUtils.isEmpty(type) ? "all" : type;
        final List<Myobject> objects= service.check(emails, subscriptiontype);

    return objects;
}

}

我正在尝试为此控制器类编写单元测试

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = SubscriberApiController.class)

public class ApiControllerTest {

private MockMvc mvc;

@Autowired
private WebApplicationContext webApplicationContext;

@MockBean
private ApiService service;

@Before
public void setUp() {
//  mvc = MockMvcBuilders.standaloneSetup(new HandlerController()).build();
    mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

@Test
public void getIndex() throws Exception {
    mvc.perform(get("/my-service/api/check?email=someone@someone.com").accept(MediaType.APPLICATION_JSON))
       .andExpect(status().isOk());

}
}

但是它向我展示了映射错误No mapping found for HTTP request with URI

2018-04-20 11:51:23.409  INFO 12968 --- [           main] c.a.d.s.service.api.ApiControllerTest    : No active profile set, falling back to default profiles: default
    2018-04-20 11:51:23.432  INFO 12968 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@43f02ef2: startup date [Fri Apr 20 11:51:23 BST 2018]; root of context hierarchy
    2018-04-20 11:51:24.847  INFO 12968 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/api/check/{type} || /api/check],methods=[GET],produces=[application/json;charset=UTF-8 || application/xml]}" onto public com.aerlingus.dei.subscriber.service.api.model.Subscriptions com.aerlingus.dei.subscriber.service.api.controller.SubscriberApiController.checkSubscriptionForUSersByType(java.util.List<java.lang.String>,java.lang.String)
    2018-04-20 11:51:24.852  INFO 12968 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    2018-04-20 11:51:24.852  INFO 12968 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    2018-04-20 11:51:24.944  INFO 12968 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@43f02ef2: startup date [Fri Apr 20 11:51:23 BST 2018]; root of context hierarchy
    2018-04-20 11:51:24.993  INFO 12968 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in badRequestExceptionHandler
    2018-04-20 11:35:47.040  INFO 30276 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@43f02ef2: startup date [Fri Apr 20 11:35:44 BST 2018]; root of context hierarchy
    2018-04-20 11:35:47.110  INFO 30276 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in badRequestExceptionHandler
    2018-04-20 11:35:47.454  INFO 30276 --- [           main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring FrameworkServlet ''
    2018-04-20 11:35:47.454  INFO 30276 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : FrameworkServlet '': initialization started
    2018-04-20 11:35:47.475  INFO 30276 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : FrameworkServlet '': initialization completed in 21 ms
    2018-04-20 11:35:47.625  INFO 30276 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 2147483647
    2018-04-20 11:35:47.626  INFO 30276 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
    2018-04-20 11:35:47.656  INFO 30276 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
    2018-04-20 11:35:47.702  INFO 30276 --- [           main] s.d.s.w.s.ApiListingReferenceScanner     : Scanning for api listing references
    2018-04-20 11:35:47.938  INFO 30276 --- [           main] .d.s.w.r.o.CachingOperationNameGenerator : Generating unique operation named: checkSubscriptionForUSersByTypeUsingGET_1
    2018-04-20 11:35:47.960  INFO 30276 --- [           main] c.a.d.s.s.api.HandlerControllerTest      : Started HandlerControllerTest in 3.653 seconds (JVM running for 4.761)
    2018-04-20 11:35:47.983  INFO 30276 --- [           main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring FrameworkServlet ''
    2018-04-20 11:35:47.983  INFO 30276 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : FrameworkServlet '': initialization started
    2018-04-20 11:35:47.985  INFO 30276 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : FrameworkServlet '': initialization completed in 2 ms
    2018-04-20 11:35:48.031  WARN 30276 --- [           main] o.s.web.servlet.PageNotFound             : No mapping found for HTTP request with URI [/my-service/api/check] in DispatcherServlet with name ''
    2018-04-20 11:35:48.050  INFO 30276 --- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@43f02ef2: startup date [Fri Apr 20 11:35:44 BST 2018]; root of context hierarchy
    2018-04-20 11:35:48.052  INFO 30276 --- [       Thread-2] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 2147483647

我的ciontext root没有映射到servlet

server.servlet.contextPath=/my-service

如果我将测试更改为

 mvc.perform(get("/api/check?email=someone@someone.com").accept(MediaType.APPLICATION_JSON))
       .andExpect(status().isOk());

工作正常

更新

http://localhost:8080/my-service/api/check?email=someone@someone.com

有人可以告诉我这里有什么问题吗???

2 个答案:

答案 0 :(得分:1)

MockMvc是一个模拟器,它不是来自服务器配置的加载上下文路径。您必须将contextPath添加到mockMvc对象:

mvc.perform(get("/my-service/api/check?email=someone@someone.com")
    .contextPath("/my-service")
    .accept(MediaType.APPLICATION_JSON))
    .andExpect(status().isOk());

答案 1 :(得分:1)

配置错误。替换:

server.servlet.contextPath=/my-service

使用:

server.contextPath=/my-service