Инфраструктура тестового контекста Spring
Разберитесь, как инфраструктура тестового контекста Spring инициализирует контексты приложения и управляет ими для интеграционных тестов.
«Инфраструктура тестового контекста Spring» — бесплатный урок Testing Mastery: JUnit, Mockito & Integration Tests на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Testing Mastery: JUnit, Mockito & Integration Tests, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Testing Mastery: JUnit, Mockito & Integration Tests содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Spring Test Context Intro
Welcome to Spring Boot integration testing! When you write tests for Spring applications, you need a way to bring up a part of your application. That's where the Spring Test Context Framework comes in.
It provides the infrastructure to load and manage an ApplicationContext for your tests, ensuring they run in a Spring-aware environment. This is crucial for tests that interact with beans, services, or data layers.
The @SpringBootTest Annotation
The core of Spring Boot integration testing is the @SpringBootTest annotation. It tells JUnit to bootstrap the Spring Boot application context for your test.
- It starts a full
ApplicationContext. - It finds the main configuration class (often your
@SpringBootApplicationclass). - It provides access to all your Spring beans within the test.
Think of it as running your entire application, but specifically for your test's needs.
How Contexts Are Loaded
When @SpringBootTest is used, Spring's test framework looks for your main application class (the one annotated with @SpringBootApplication) and uses it to create an ApplicationContext.
This context is essentially a container for all the components (beans) of your application. Your test then runs against this live application context, allowing it to interact with actual services, repositories, and other Spring-managed components.
Context Caching for Speed
Loading a full Spring ApplicationContext can be slow. To speed up your test suite, the Spring Test Context Framework intelligently caches contexts.
- If multiple tests require the exact same context configuration, Spring will reuse the previously loaded context.
- This significantly reduces test execution time, especially in large projects.
- The context is only reloaded if the configuration (e.g., properties, active profiles) changes.
Basic Spring App Example
Here's a minimal Spring Boot application. When you use @SpringBootTest, the framework will load a context based on this class, making its beans available to your tests.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(MyApp.class, args);
System.out.println("App context loaded: " + (context != null));
}
}Using @SpringBootTest (Test)
Now, let's see how a test would use @SpringBootTest to load the context for the MyApp from the previous scene. We inject the ApplicationContext to verify it's loaded.
Notice this test class doesn't have a main method itself, as JUnit runners handle its execution.
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class MyApplicationTests {
@Test
void contextLoads(ApplicationContext context) {
assertThat(context).isNotNull();
System.out.println("ApplicationContext loaded for test!");
}
}Customizing Web Environment
For web applications, @SpringBootTest can start a web server for your tests. You control this behavior using the webEnvironment attribute:
MOCK(default): Provides a mock servlet environment.RANDOM_PORT: Starts an embedded server on a random port.DEFINED_PORT: Starts an embedded server on the default or configured port.NONE: Does not start an embedded server.
RANDOM_PORT is often preferred to avoid port conflicts.
Web Environment Example
Here's how you'd configure @SpringBootTest to start a web server on a random port. This allows you to perform actual HTTP requests against your application within your tests.
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.beans.factory.annotation.Value;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class WebAppTests {
@Value(value="${local.server.port}")
private int port;
@Test
void serverStarts() {
assertThat(port).isNotZero();
System.out.println("Web server started on port: " + port);
}
}Overriding Test Properties
Sometimes, you need specific configuration properties for your tests that differ from your main application (e.g., a test database URL). You can override these using the properties attribute in @SpringBootTest.
This allows you to isolate your test environment without changing production code.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
@SpringBootApplication
public class PropApp implements CommandLineRunner {
@Value("${app.message:Default Message}")
private String message;
public static void main(String[] args) {
SpringApplication.run(PropApp.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("App Message: " + message);
}
}Quick Check
Which @SpringBootTest.WebEnvironment option would you use to start an embedded web server on an available, random port?
Recap: Spring Test Context
You've learned about the Spring Test Context Framework, a powerful tool for integration testing. We covered:
- The purpose of the framework and
@SpringBootTest. - How application contexts are loaded and cached.
- Customizing test environments with
webEnvironment. - Overriding properties for test-specific configurations.
This foundation is essential for writing robust and efficient Spring Boot integration tests!
Часто задаваемые вопросы
Урок «Инфраструктура тестового контекста Spring» бесплатный?
Да — полный текст урока «Инфраструктура тестового контекста Spring» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Testing Mastery: JUnit, Mockito & Integration Tests, подпишись на CoddyKit PRO. Курс Testing Mastery: JUnit, Mockito & Integration Tests содержит 4 уроков всего.
Чему я научусь в уроке «Инфраструктура тестового контекста Spring»?
Разберитесь, как инфраструктура тестового контекста Spring инициализирует контексты приложения и управляет ими для интеграционных тестов. Ты практикуешь Testing Mastery: JUnit, Mockito & Integration Tests с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Testing Mastery: JUnit, Mockito & Integration Tests?
Предыдущий опыт не требуется. Testing Mastery: JUnit, Mockito & Integration Tests на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Инфраструктура тестового контекста Spring»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Testing Mastery: JUnit, Mockito & Integration Tests?
Да. Каждый урок Testing Mastery: JUnit, Mockito & Integration Tests включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Инфраструктура тестового контекста Spring
- Тестирование RESTful API
- Встроенные базы данных для тестов
- Тестирование веб-слоёв с помощью @WebMvcTest и MockMvc