How to set servlet path for every request through

2019-02-14 11:49发布

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?

1条回答
来,给爷笑一个
2楼-- · 2019-02-14 12:46

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.

查看更多
登录 后发表回答