Нужно ли мне создавать новый MockMvc для каждого теста?

Я пытаюсь добавить Cucumber в свой проект Spring Web MVC, который уже использует spring-test и JUnit. В интеграционных тестах, отличных от Cucumber, которые я уже написал, WebApplicationContext автоматически подключается, а затем создается MockMvc для каждого теста. Пример с огурцом Я пытаюсь работать с внедрением MockMvc один раз за время существования класса определения шага.

Документация по API для MockMVC не дает никаких указаний о том, как вызов perform изменяет экземпляр MockMvc и допустимо ли повторное использование экземпляра MockMvc для нескольких тестов. Я также не смог найти определенного ответа в справочнике документы.

Какой договор с MockMvc? Должен ли я создавать новый для каждого теста?


person Jason Whittle    schedule 18.12.2015    source источник
comment
В своем тесте создайте @Before и инициализируйте mockmvc. Посмотрите здесь: http://stackoverflow.com/a/14566090/3710490   -  person Valijon    schedule 19.12.2015
comment
Спасибо, @Valijon; именно так я делаю это в своих существующих тестах JUnit. Однако пример, который я привожу, делает это по-другому, и я хотел бы знать, поддерживает ли контракт для MockMvc этот другой способ ведения дел.   -  person Jason Whittle    schedule 19.12.2015


Ответы (2)


Взгляните на переменные экземпляра MockMvc, и вы сможете вывести ответ.

static String MVC_RESULT_ATTRIBUTE = MockMvc.class.getName().concat(".MVC_RESULT_ATTRIBUTE");

private final TestDispatcherServlet servlet;

private final Filter[] filters;

private final ServletContext servletContext;

private RequestBuilder defaultRequestBuilder;

private List<ResultMatcher> defaultResultMatchers = new ArrayList<ResultMatcher>();

private List<ResultHandler> defaultResultHandlers = new ArrayList<ResultHandler>();

Переменные экземпляра/класса MVC_RESULT_ATTRIBUTE и TestDispatcherServlet являются потокобезопасными, а filters и servletContext устанавливаются только во время инициализации. filters и servletContext также должны быть потокобезопасными и без сохранения состояния. defaultRequestBuilder, defaultResultMatchers и defaultResultHandlers имеют метод установки. С технической точки зрения MockMvc не является потокобезопасным и не должен использоваться повторно. Эти установщики являются частными пакетами, и экземпляр MockMvc можно получить только через MockMvcBuilders. Следовательно, вы не можете впоследствии манипулировать экземпляром MockMvc, чтобы его можно было повторно использовать в нескольких тестах.

person ksokol    schedule 22.12.2015

MockMvc можно создать один раз и использовать для любого количества запросов.

person Rossen Stoyanchev    schedule 22.12.2015