Spring Тесты интеграции с загрузкой: @AutoConfigureMockMvc и контекстное кэширование
Я создаю очень основное веб-приложение с помощью 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, но он не работает для меня (он не включает фильтры при обработке веб-запросов).
Ответы
Ответ 1
Кажется, это ошибка, представленная в Spring Boot 1.5:
https://github.com/spring-projects/spring-boot/issues/9282
Вы можете попробовать перейти на Spring Boot 1.4.x или дождаться исправленной версии (планируется к следующей версии 1.5.5).
Обновление:
Вместо "@AutoConfigureMockMvc" вы также можете вручную настроить MockMVC:
https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/test-mockmvc.html
Ручная настройка MockMVC отлично сработала на моем проекте.
Что вы имеете в виду под "не включает фильтры при обработке веб-запросов"?