Я создаю очень основное веб-приложение с помощью Spring Boot 1.5.1 и хотел создать интеграционные тесты для проверки конечных точек REST. Как рекомендовано документацией, MockMvc может быть использован для этого.
Вот очень простой тестовый класс:
package foo.bar.first;
import ...
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApplicationTest1 {
@Autowired
private WebApplicationContext context;
@Autowired
private MockMvc mvc;
@Test
public void shouldStartWebApplicationContext() {
assertThat(context).isNotNull();
}
@Test
public void shouldReplyToPing() throws Exception {
mvc.perform(get("/ping"))
.andExpect(status().isOk());
}
}
Как и ожидалось, он запускает полный контекст приложения и запускает тесты.
Позже я создал другие подобные тестовые классы и заметил, что бренд новый контекст приложения запущен для каждого тестового класса. Эксперименты показывают, что контекст используется только между тестовыми классами из одного пакета.
Например, если один и тот же тестовый класс копируется несколько раз, контексты выглядят следующим образом:
foo.bar
first
ApplicationTest1 (shared context)
ApplicationTest2 (shared context)
second
ApplicationTest3 (brand new context)
Другие исследования показали, что он связан с аннотацией @AutoConfigureMockMvc
. Если аннотации и связанные с MockMvc тестовые примеры удалены, то все три класса с успехом используют один и тот же контекст.
Итак, вопрос в том, как получить общий контекст для всех тестов с помощью MockMvc?
Примечание: другие ресурсы предлагают использовать MockMvcBuilders.webAppContextSetup(context).build()
для получения экземпляра MockMvc, но он не работает для меня (он не включает фильтры при обработке веб-запросов).