Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set servlet path for every request through MockMvc

Is it possible to set the servlet path for all requests (get, post, put, delete) which go through the MockMvc?

The Spring dispatch servlet is mapped to /rest/* But in my test I have to remove the /rest part in the url otherwise Spring test does not recognise the controller.

EDIT

@Sotirios:

Something is possible like:

public class MyWebTests {

    private MockMvc mockMvc;

    @Before
    public void setup() {
        mockMvc = standaloneSetup(new AccountController())
            .defaultRequest(get("/")
            .contextPath("/app").servletPath("/main")
            .accept(MediaType.APPLICATION_JSON).build();

} }

But I wonder how servlet path can be set for all requests. Above code is from http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/testing.html.

Or is it only possible to define the servletPath with the standaloneSetup?

like image 965
Marcel Overdijk Avatar asked Feb 17 '14 19:02

Marcel Overdijk


1 Answers

I've had problems with ServletException("Circular view path ...") which happened only in real deployment but never in our tests with MockMvc.

The problem was that a method was not annotated with @ResponseBody. The test worked fine as there was an empty servlet path so it resolved a viewName to 'servletPath/callPath' which was different from 'callPath' so it did not throw the ServletException. Hence I needed to set servletPath on test requests to get closer to how the app is deployed and get our tests to fail in case one forgets the annotation.

.defaultRequest(get("/").servletPath("/main")) 

worked for me like a charm. So the answer in the question works.

like image 76
Ondrej Burkert Avatar answered Sep 28 '22 01:09

Ondrej Burkert