Автор: СТЕФАН НИКОЛЛ
Переводчик: helloworldtang
Spring Boot 1.4 включает значительную поддержку модульного тестирования, одной из функций является нарезка тестов. В этом сообщении блога я хотел воспользоваться возможностью, чтобы подробнее объяснить, что это такое и как вы можете легко создавать свои собственные фрагменты.
Тестовая нарезка – это создание ApplicationContext
сегментация。в целом,Если вы хотите использовать MockMvc
Тестирование контроллера,Тогда вы определенно не хотите использовать уровень данных. Напротив,Возможно, вы захотите посмеяться Служба, которую использует ваш контроллер и проверяет, что все взаимодействия, связанные с Интернетом, работают должным образом. Это можно сделать в следующем примере. итог:
@RunWith(SpringRunner.class)
@WebMvcTest(UserVehicleController.class)
public class UserVehicleControllerTests {
@Autowired
private MockMvc mvc;
@MockBean
private UserVehicleService userVehicleService;
@Test
public void testExample() throws Exception {
given(this.userVehicleService.getVehicleDetails("sboot"))
.willReturn(new VehicleDetails("Honda", "Civic"));
this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
.andExpect(status().isOk()).andExpect(content().string("Honda Civic"));
}
}
@WebMvcTest
даSpring Boot Нарезка веб-тестов в версии 1.4. Когда он появится, вы сообщите Spring Для загрузки здесь требуется веб-среда, и должен быть создан экземпляр только указанного контроллера. Поскольку он знает, что пытается сделать этот тест, он может предоставить вам дополнительные интеллектуальные решения (например, автоматическую настройку). MockMvc
,Так что осталось только закачать). кроме того,Поскольку ваш контроллер также полагается на UserVehicleService
,Итак, начнитеSpring Загрузочный проект завершится неудачей, потому что ApplicationContext
Не зарегистрирован в UserVehicleService
(помнить,толькоwebинфраструктура и UserVehicleController
даизвестныйиз)。 @MockBean
Используйте его, чтобы зарегистрировать его здесь UserVehicleService
изmock,Таким образом, его можно прозрачно ввести в контроллер.
Теперь давайте посмотрим на конкретную реализацию для лучшего понимания. Spring Как Boot управляет всем этим за вас. Наша первая остановка – @WebMvcTest
(Удаленный @Target
и другие метааннотации):
@BootstrapWith(WebMvcTestContextBootstrapper.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(WebMvcTypeExcludeFilter.class)
@AutoConfigureCache
@AutoConfigureWebMvc
@AutoConfigureMockMvc
@ImportAutoConfiguration
public @interface WebMvcTest { ... }
Это утверждение можно разделить на три аспекта:
Spring Boot 1.4 теперь определяет spring-boot-test-autoconfigure
модуль,Он предоставляет набор автоматических конфигураций, связанных с тестированием. Эти автоматические конфигурации являются составными.,Может помочь вам легко построить собственную инфраструктуру.
вернуться в @WebMvcTest
,мы должны сделатьиз Первое, чтода Отключено по умолчаниюизавтоматическая конфигурация: OverrideAutoConfiguration
Сразудасделай этоиз。потому что по умолчаниюизавтоматическая конфигурация现существовать Уже отключено,Итак, вам нужно выбрать, что вы хотите включитьиз相关автоматическая конфигурация。эти трое AutoConfigure
Аннотации делают это за насизиметь значение:они гарантируютwebдоступная среда, MockMvc
настроен и доступен менеджер неактивного кэша. давайте посмотрим раздел AutoconfigureMockMvc
изкод:
@ImportAutoConfiguration
@PropertyMapping("spring.test.mockmvc")
public @interface AutoConfigureMockMvc {
boolean addFilters() default true;
@PropertyMapping("webclient.enabled")
boolean webClientEnabled() default true;
...
}
@ImportAutoConfiguration
дазаписка,В нем перечислены автоконфигурации, которые необходимо включить. или,Вы можете использовать ключевые словаиз Указано полное имя META-INF/spring.factories
серединаизсписок。
AutoConfigureMockMvc
из Определение следующее:
org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc=\
org.s.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration,\
org.s.boot.test.autoconfigure.web.servlet.MockMvcSecurityAutoConfiguration,\
org.s.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration,\
org.s.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration
Вы можете подумать, что каждая аннотация содержит некоторую автоматическую настройку, и вы можете комбинировать их любым способом. ты заметишь WebMvcTest
Есть также один ImportAutoConfiguration
,нодасуществовать spring.factories
Нет связанных записей в。Spring Boot просканирует весь путь к классам spring.factories
,если необходимо,Воля Объединить контент. Если один из ваших модулей хочет @WebMvcTest
(или @AutoConfigureMockMvc
)добавить дополнительныйиз Поведение,тогда что нужноиз Сразуда Создайте META-INF/spring.factories
Файл ресурсови Зарегистрируйтесь для получения дополнительныхизавтоматическая конфигурация类。Вы также можете использовать @AutoconfigureBefore
и @AutoconfigureAfter
назначить приоритет。
Автоматическую конфигурацию, используемую для тестирования, также можно настроить: на уровне класса. @PropertyMapping
аннотация Воляаннотацияизатрибуты сопоставляются с Environment
,Таким образом, код автоконфигурации может извлечь значение и соответствующим образом скорректировать конфигурацию.。мы можем видеть вышеиз webClientEnabled
Свойства прозрачно используются при автоконфигурации.:
@ConditionalOnProperty(prefix = "spring.test.mockmvc.webclient",
name = "enabled", matchIfMissing = true)
public class MockMvcWebClientAutoConfiguration { ... }
TypeExcludeFilters
да Оптимизированное сканирование пути к классамизметод。существовать @WebMvcTest
В этом случае мы включим только определенные веб-компоненты и проигнорируем остальные. Это очень эффективно, поскольку вы можете выполнить сканирование пути к классам обычным способом и включить только то, что необходимо для среза.
Наконец, новый Руководство по программа тестирования обеспечивает идентификацию в проектах @SpringBootApplication
Класс аннотации(Если один не указан)。этотда Хорошийиззначение по умолчанию,потому что вам больше не нужно это указывать,И сканирование пути к классам по умолчанию корректно.
Основываясь на этих знаниях, создавать собственные фрагменты на самом деле очень просто. Примером чего-то вроде нарезки может быть новый DataJdbcTest
,Похоже на: DataJpaTest
изкусочек,Он только настраивает JdbcTemplate
,И не использует JPA. Если вы хотите, чтобы ваш код работал,пожалуйста, проверьте github repository для более подробной информации.
Наш первый шаг — создать @AutoconfigureDataJdbc
package com.example.test.autoconfigure.jdbc;
import java.lang.annotation.*;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ImportAutoConfiguration
public @interface AutoconfigureDataJdbc {
}
и регистрирует соответствующую автоконфигурацию, которая будет применена при появлении этой аннотации. И снова создайте META-INF/spring.factories
Ресурсный файл:
com.example.test.autoconfigure.jdbc.AutoconfigureDataJdbc=\
org.s.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.s.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.s.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.s.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.s.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.s.boot.autoconfigure.transaction.TransactionAutoConfiguration
Как только эта многоразовая инфраструктура будет создана, вы можете создать свой тестовый фрагмент и просто указать, что вам нужна база данных и jdbc:
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(DataJdbcTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoconfigureDataJdbc
@AutoConfigureTestDatabase
@ImportAutoConfiguration
public @interface DataJdbcTest { }
DataJdbcTypeExcludeFilter
Обязательно исключите все остальные службы.,Потому что такие тесты по умолчанию не требуют никаких bean-компонентов. это можно улучшить,Позволяет определять сервисы как параметры аннотаций.,нравиться WebMvcTest
Добавить обозначениеиз То же, что контроллер。
После того, как вы это сделаете, вам просто нужно добавить аннотацию, и ваш JdbcTemplate
Тестовая база данных будет автоматически настроена для вас.:
@RunWith(SpringRunner.class)
@DataJdbcTest
public class DataJdbcSampleTests {
@Autowired
private JdbcTemplate jdbcTemplate;
...
}
Spring Boot 1.4 Обеспечивает автоматическую настройку ваших тестов и позволяет легко писать собственные аннотации к тестам. В этой статье мы узнали о WebMvcTest
Как это работает и как создать свой собственный фрагмент «jdbc». На самом деле мы рассматриваем возможность добавления этой аннотации в следующую версию, поэтому, пожалуйста, не стесняйтесь комментировать и предлагать ее!