Как установить путь сервлета для каждого запроса через MockMvc

Можно ли установить путь сервлета для всех запросов (получить, опубликовать, поставить, удалить), которые проходят через MockMvc?

Сервлет отправки Spring сопоставлен с /rest/* Но в моем тесте я должен удалить часть /rest в URL-адресе, иначе тест Spring не распознает контроллер.

РЕДАКТИРОВАТЬ

@Сотириос:

Что-то возможно, например:

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();

} }

Но мне интересно, как можно установить путь сервлета для всех запросов. Код выше взят из http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/testing.html.

Или можно определить servletPath только с помощью standaloneSetup?


person Marcel Overdijk    schedule 17.02.2014    source источник
comment
Когда вы устанавливаете contextPath и servletPath как часть defaultRequest при создании MockMVC в методе setup(), они действительно применяются ко всем запросам. Это работает даже с webAppContextSetup, а не только с standaloneSetup.   -  person ami91    schedule 08.06.2016
comment
@ami91 Большое спасибо за подсказку, это действительно работает. Хотя хотелось бы, чтобы это было более очевидно...   -  person Pavel S.    schedule 17.02.2021


Ответы (1)


У меня были проблемы с ServletException("Circular view path..."), которые возникали только при реальном развертывании, но никогда не возникали в наших тестах с MockMvc.

Проблема заключалась в том, что метод не был аннотирован @ResponseBody. Тест работал нормально, так как был пустой путь к сервлету, поэтому он разрешил viewName в «servletPath/callPath», который отличался от «callPath», поэтому он не вызывал исключение ServletException. Следовательно, мне нужно было установить servletPath в тестовых запросах, чтобы приблизиться к тому, как развертывается приложение, и заставить наши тесты провалиться, если кто-то забудет аннотацию.

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

работал на меня как шарм. Так что ответ в вопросе работает.

person Ondrej Burkert    schedule 28.01.2015