Marcel Overdijk
Marcel Overdijk

Reputation: 11467

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?

Upvotes: 13

Views: 10641

Answers (1)

Ondrej Burkert
Ondrej Burkert

Reputation: 7272

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.

Upvotes: 4

Related Questions