Тестирование Spring Boot приложений

Приложение Spring Boot - это Spring ApplicationContext, поэтому ничего особенного не нужно делать, чтобы протестировать его, кроме того, что вы обычно делаете с обычным контекстом Spring.

Внешние свойства, ведение журнала и другие функции Spring Boot устанавливаются в контексте по умолчанию, только если вы используете SpringApplication для его создания.

Spring Boot предоставляет аннотацию @SpringBootTest, которую можно использовать в качестве альтернативы стандартной аннотации spring-test @ContextConfiguration, когда вам нужны функции Spring Boot. Аннотация работает, создавая ApplicationContext, используемый в ваших тестах, через SpringApplication. В дополнение к @SpringBootTest также предусмотрен ряд других аннотаций для тестирования более специфических фрагментов приложения.

Если вы используете JUnit 4, не забудьте также добавить @RunWith(SpringRunner.class) в ваш тест, иначе аннотации будут проигнорированы. Если вы используете JUnit 5, нет необходимости добавлять эквивалент @ExtendWith(SpringExtension.class) в качестве @SpringBootTest, а остальные @… аннотации теста уже аннотированы с ним.

По умолчанию @SpringBootTest не запускает сервер. Вы можете использовать атрибут webEnvironment @SpringBootTest для дальнейшего уточнения того, как выполняются ваши тесты:

  • MOCK (по умолчанию): загружает веб ApplicationContext и предоставляет фиктивную веб-среду. Встроенные серверы не запускаются при использовании этой аннотации. Если веб-среда недоступна на вашем пути к классам, этот режим прозрачно возвращается к созданию обычного не веб ApplicationContext. Его можно использовать вместе с @AutoConfigureMockMvc или @AutoConfigureWebTestClient для тестового тестирования вашего веб-приложения.
  • RANDOM_PORT: загружает WebServerApplicationContext и предоставляет реальную веб-среду. Встроенные серверы запускаются и прослушивают случайный порт.
  • DEFINED_PORT: загружает WebServerApplicationContext и предоставляет реальную веб-среду. Встроенные серверы запускаются и прослушивают определенный порт (из вашего application.properties) или порт 8080 по умолчанию.
  • NONE: загружает ApplicationContext с помощью SpringApplication, но не предоставляет какой-либо веб-среды (фиктивной или иной).

Если ваш тест является @Transactional, он по умолчанию откатывает транзакцию в конце каждого метода тестирования. Однако, поскольку использование этого соглашения с RANDOM_PORT или DEFINED_PORT неявно обеспечивает реальную среду сервлета, HTTP-клиент и сервер работают в отдельных потоках и, таким образом, в отдельных транзакциях. Любая транзакция, инициированная на сервере, в этом случае не откатывается.

@SpringBootTest с webEnvironment = WebEnvironment.RANDOM_PORT также запустит сервер управления на отдельном случайном порте, если ваше приложение использует другой порт для сервера управления.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки