Как использовать пользовательские тестовые фрагменты под Spring Boot
Как использовать пользовательские тестовые фрагменты под Spring Boot
Исходная ссылка: https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4.

Автор: СТЕФАН НИКОЛЛ

Переводчик: helloworldtang

Spring Boot 1.4 включает значительную поддержку модульного тестирования, одной из функций является нарезка тестов. В этом сообщении блога я хотел воспользоваться возможностью, чтобы подробнее объяснить, что это такое и как вы можете легко создавать свои собственные фрагменты.

Тестовая нарезка – это создание ApplicationContextсегментация。в целом,Если вы хотите использовать MockMvcТестирование контроллера,Тогда вы определенно не хотите использовать уровень данных. Напротив,Возможно, вы захотите посмеяться Служба, которую использует ваш контроллер и проверяет, что все взаимодействия, связанные с Интернетом, работают должным образом. Это можно сделать в следующем примере. итог:

Язык кода:javascript
копировать
@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и другие метааннотации):

Язык кода:javascript
копировать
@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изкод:

Язык кода:javascript
копировать
@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из Определение следующее:

Язык кода:javascript
копировать
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Свойства прозрачно используются при автоконфигурации.:

Язык кода:javascript
копировать
@ConditionalOnProperty(prefix = "spring.test.mockmvc.webclient", 
        name = "enabled", matchIfMissing = true)
public class MockMvcWebClientAutoConfiguration { ... }

Настройка сканирования пути к классам

TypeExcludeFiltersда Оптимизированное сканирование пути к классамизметод。существовать @WebMvcTest В этом случае мы включим только определенные веб-компоненты и проигнорируем остальные. Это очень эффективно, поскольку вы можете выполнить сканирование пути к классам обычным способом и включить только то, что необходимо для среза.

Руководство по тестированию

Наконец, новый Руководство по программа тестирования обеспечивает идентификацию в проектах @SpringBootApplicationКласс аннотации(Если один не указан)。этотда Хорошийиззначение по умолчанию,потому что вам больше не нужно это указывать,И сканирование пути к классам по умолчанию корректно.

Создайте свой собственный кусочек

Основываясь на этих знаниях, создавать собственные фрагменты на самом деле очень просто. Примером чего-то вроде нарезки может быть новый DataJdbcTest,Похоже на: DataJpaTestизкусочек,Он только настраивает JdbcTemplate,И не использует JPA. Если вы хотите, чтобы ваш код работал,пожалуйста, проверьте github repository для более подробной информации.

Наш первый шаг — создать @AutoconfigureDataJdbc

Язык кода:javascript
копировать
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 Ресурсный файл:

Язык кода:javascript
копировать
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:

Язык кода:javascript
копировать
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(DataJdbcTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoconfigureDataJdbc
@AutoConfigureTestDatabase
@ImportAutoConfiguration
public @interface DataJdbcTest { }

DataJdbcTypeExcludeFilterОбязательно исключите все остальные службы.,Потому что такие тесты по умолчанию не требуют никаких bean-компонентов. это можно улучшить,Позволяет определять сервисы как параметры аннотаций.,нравиться WebMvcTestДобавить обозначениеиз То же, что контроллер。

После того, как вы это сделаете, вам просто нужно добавить аннотацию, и ваш JdbcTemplateТестовая база данных будет автоматически настроена для вас.:

Язык кода:javascript
копировать
@RunWith(SpringRunner.class)
@DataJdbcTest
public class DataJdbcSampleTests {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    ...
}

Подвести итог

Spring Boot 1.4 Обеспечивает автоматическую настройку ваших тестов и позволяет легко писать собственные аннотации к тестам. В этой статье мы узнали о WebMvcTest Как это работает и как создать свой собственный фрагмент «jdbc». На самом деле мы рассматриваем возможность добавления этой аннотации в следующую версию, поэтому, пожалуйста, не стесняйтесь комментировать и предлагать ее!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose