ConfigDataApplicationContextInitializer
ConfigDataApplicationContextInitializer
– это ApplicationContextInitializer
, который можно применять к тестам для загрузки файлов application.properties
для Spring Boot. Можно использовать его, если нет необходимости в полном наборе функций, предусмотренных аннотацией @SpringBootTest
, как это показано в следующем примере:
@ContextConfiguration(classes = Config.class, initializers = ConfigDataApplicationContextInitializer.class)
class MyConfigFileTests {
// ...
}
@ContextConfiguration(classes = [Config::class], initializers = [ConfigDataApplicationContextInitializer::class])
class MyConfigFileTests {
// ...
}
ConfigDataApplicationContextInitializer
не обеспечит поддержку внедрения аннотации @Value("${…}")
. Его единственная задача – обеспечить загрузку файлов application.properties
в Environment
для Spring. Для обеспечения поддержки аннотации @Value
необходимо либо дополнительно сконфигурировать PropertySourcesPlaceholderConfigurer
, либо использовать аннотацию @SpringBootTest
, которая автоматически его сконфигурирует за вас.TestPropertyValues
Класс TestPropertyValues
позволяет быстро добавить свойства в ConfigurableEnvironment
или ConfigurableApplicationContext
. Можно вызвать его с помощью строк key=value
, как показано ниже:
class MyEnvironmentTests {
@Test
void testPropertySources() {
MockEnvironment environment = new MockEnvironment();
TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment);
assertThat(environment.getProperty("name")).isEqualTo("Boot");
}
}
class MyEnvironmentTests {
@Test
fun testPropertySources() {
val environment = MockEnvironment()
TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment)
assertThat(environment.getProperty("name")).isEqualTo("Boot")
}
}
OutputCapture
OutputCapture
– это Extension
для JUnit, которое можно использовать для захвата вывода System.out
и System.err
. Для использования добавьте аннотацию @ExtendWith(OutputCaptureExtension.class)
и внедрите CapturedOutput
в качестве аргумента в конструктор вашего тестового класса или тестовый метод следующим образом:
@ExtendWith(OutputCaptureExtension.class)
class MyOutputCaptureTests {
@Test
void testName(CapturedOutput output) {
System.out.println("Hello World!");
assertThat(output).contains("World");
}
}
@ExtendWith(OutputCaptureExtension::class)
class MyOutputCaptureTests {
@Test
fun testName(output: CapturedOutput?) {
println("Hello World!")
assertThat(output).contains("World")
}
}
TestRestTemplate
TestRestTemplate
– это удобная альтернатива RestTemplate
из Spring, которая полезна в рамках интеграционных тестов. Можно получить ванильный шаблон или тот, который отправляет базовую HTTP-аутентификацию (с именем пользователя и паролем). В любом случае шаблон является устойчивым к сбоям. Это значит, что его логика работы удобна для тестирования и не генерирует исключения при ошибках 4xx и 5xx. Вместо этого такие ошибки можно обнаружить через возвращаемый ResponseEntity
и его код состояния.
WebTestClient
, который хорошо подходит и для интеграционных тестов в WebFlux, и для <сквозного тестирования в WebFlux и MVC<. В отличие от TestRestTemplate, он предусматривает текучий API для добавления утверждений.сквозного>
Рекомендуется – хоть и не обязательно – использовать Apache HTTP Client (версии 4.3.2 или выше). Если он находится в вашем classpath, шаблон TestRestTemplate
среагирует на это и сконфигурирует клиент соответствующим образом. Если вы используете HTTP-клиент от Apache, добавляются некоторые дополнительные функции, полезные для тестирования:
-
Перенаправления не отслеживаются (поэтому можно добавлять утверждения для местоположения ответа).
-
Файлы cookie игнорируются (поэтому шаблон не сохраняет состояние).
Экземпляр TestRestTemplate
можно создать непосредственно в интеграционных тестах, как показано в следующем примере:
class MyTests {
private final TestRestTemplate template = new TestRestTemplate();
@Test
void testRequest() {
ResponseEntity<String> headers = this.template.getForEntity("https://myhost.example.com/example", String.class);
assertThat(headers.getHeaders().getLocation()).hasHost("other.example.com");
}
}
class MyTests {
private val template = TestRestTemplate()
@Test
fun testRequest() {
val headers = template.getForEntity("https://myhost.example.com/example", String::class.java)
assertThat(headers.headers.location).hasHost("other.example.com")
}
}
Кроме того, если вы используете аннотацию @SpringBootTest
с WebEnvironment.RANDOM_PORT
или WebEnvironment.DEFINED_PORT
, можно внедрить полностью сконфигурированный TestRestTemplate
и начать его использовать. При необходимости дополнительные настройки можно применить через бин RestTemplateBuilder
. Любые URL-адреса, в которых не указаны хост и порт, автоматически подключаются к встроенному серверу, как показано в следующем примере:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MySpringBootTests {
@Autowired
private TestRestTemplate template;
@Test
void testRequest() {
HttpHeaders headers = this.template.getForEntity("/example", String.class).getHeaders();
assertThat(headers.getLocation()).hasHost("other.example.com");
}
@TestConfiguration(proxyBeanMethods = false)
static class RestTemplateBuilderConfiguration {
@Bean
RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1))
.setReadTimeout(Duration.ofSeconds(1));
}
}
}
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MySpringBootTests(@Autowired val template: TestRestTemplate) {
@Test
fun testRequest() {
val headers = template.getForEntity("/example", String::class.java).headers
assertThat(headers.location).hasHost("other.example.com")
}
@TestConfiguration(proxyBeanMethods = false)
internal class RestTemplateBuilderConfiguration {
@Bean
fun restTemplateBuilder(): RestTemplateBuilder {
return RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1))
.setReadTimeout(Duration.ofSeconds(1))
}
}
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ