Нужно ли создавать новый MockMvc для каждого теста?
Я пытаюсь добавить Cucumber в свой проект Spring Web MVC, который уже использует spring-test и JUnit. Уже написанные мной интеграционные тесты, отличные от Cucumber, автоматически подключаются к WebApplicationContext, а затем создаются MockMvc
за каждый тест. Пример огурца, который я пытаюсь работать с инъекциями MockMvc
один раз за время существования класса определения шага.
Документы API для MockMVC не дают никаких советов о том, как вызывать perform
модифицирует MockMvc
экземпляр, и допустимо ли повторно использовать MockMvc
экземпляр для нескольких тестов. Я также не смог найти определенный ответ в справочных документах.
Что такое контракт с MockMvc
? Должен ли я создавать новый для каждого теста?
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
затем, чтобы его можно было повторно использовать в нескольких тестах.
MockMvc может быть создан один раз и использоваться для любого количества запросов.