In my web.xml I mapped the servlet to /api like this:
<servlet-mapping>
<servlet-name>todo</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>todo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
So for the controller using @RequestMapping(value = "/todo", method = RequestMethod.GET)
, it actually gets mapped to "/api/todo"
But in test when I call mockMvc.perform(get("/api/todo/"))
I got a 404. I have to call get("/todo/")
to get the correct mapping in test. I hope to map the controller in test like in actual scenario. Is that possible?
I'm using WebMvcConfigurerAdapter
in test and I tried
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/**").addResourceLocations("/");
}
but it didn't work.
You will notice when you setup your
MockMvc
configuration that you don't specify the location of a deployment descriptor, your web.xml. That is becauseMockMvc
doesn't test your configuration of aDispatcherServlet
. It tests your MVC configuration,@Controller
beans and the like.If you look at the source,
MockMvc
creates aTestDispatcherServlet
which loads and uses your web application context.In other words, the servlet
url-pattern
path is irrelevant toMockMvc
. You make your requests as if there was no such path.You state
you will need to use a different test strategy. Fully deploy your web application and use an HTTP client to make requests and validate what you get back.
You've tagged
unit-testing
. Testing in a full environment is not unit testing, it is integration and system testing.Note that this
has nothing to do with the above. Its purpose is to serve static resources from some path in your webapp. It has nothing to do with your servlet's
url-pattern
or the path to your controllers.