此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
在测试应用程序时通常有用的一些测试实用程序类打包为 的一部分。spring-boot
ConfigDataApplicationContextInitializer
ConfigDataApplicationContextInitializer
是可以应用于测试以加载 Spring Boot 文件。
当您不需要 提供的完整功能集时,可以使用它,如以下示例所示:ApplicationContextInitializer
application.properties
@SpringBootTest
-
Java
-
Kotlin
import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer;
import org.springframework.test.context.ContextConfiguration;
@ContextConfiguration(classes = Config.class, initializers = ConfigDataApplicationContextInitializer.class)
class MyConfigFileTests {
// ...
}
import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer
import org.springframework.test.context.ContextConfiguration
@ContextConfiguration(classes = [Config::class], initializers = [ConfigDataApplicationContextInitializer::class])
class MyConfigFileTests {
// ...
}
单独使用不支持注射。
它唯一的工作是确保将文件加载到 Spring 的 .
要获得支持,您需要额外配置 a 或使用 ,这将为您自动配置 一个。ConfigDataApplicationContextInitializer @Value("${…}") application.properties Environment @Value PropertySourcesPlaceholderConfigurer @SpringBootTest |
单独使用不支持注射。
它唯一的工作是确保将文件加载到 Spring 的 .
要获得支持,您需要额外配置 a 或使用 ,这将为您自动配置 一个。ConfigDataApplicationContextInitializer @Value("${…}") application.properties Environment @Value PropertySourcesPlaceholderConfigurer @SpringBootTest |
TestPropertyValues
TestPropertyValues
用于快速向 或 添加属性。
您可以使用字符串调用它,如下所示:ConfigurableEnvironment
ConfigurableApplicationContext
key=value
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.mock.env.MockEnvironment;
import static org.assertj.core.api.Assertions.assertThat;
class MyEnvironmentTests {
@Test
void testPropertySources() {
MockEnvironment environment = new MockEnvironment();
TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment);
assertThat(environment.getProperty("name")).isEqualTo("Boot");
}
}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.boot.test.util.TestPropertyValues
import org.springframework.mock.env.MockEnvironment
class MyEnvironmentTests {
@Test
fun testPropertySources() {
val environment = MockEnvironment()
TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment)
assertThat(environment.getProperty("name")).isEqualTo("Boot")
}
}
输出捕获
OutputCapture
是可用于捕获和输出的 JUnit。
要使用它,请将 add 和 inject 作为参数添加到您的测试类构造函数或测试方法中,如下所示:Extension
System.out
System.err
@ExtendWith(OutputCaptureExtension.class)
CapturedOutput
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import static org.assertj.core.api.Assertions.assertThat;
@ExtendWith(OutputCaptureExtension.class)
class MyOutputCaptureTests {
@Test
void testName(CapturedOutput output) {
System.out.println("Hello World!");
assertThat(output).contains("World");
}
}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.system.CapturedOutput
import org.springframework.boot.test.system.OutputCaptureExtension
@ExtendWith(OutputCaptureExtension::class)
class MyOutputCaptureTests {
@Test
fun testName(output: CapturedOutput?) {
println("Hello World!")
assertThat(output).contains("World")
}
}
TestRestTemplate
TestRestTemplate
是 Spring 的便捷替代方案,在集成测试中很有用。
你可以获取一个 vanilla 模板或发送 Basic HTTP 身份验证的模板(带有用户名和密码)。
在任一情况下,模板都是容错的。
这意味着它的行为对测试友好,不会在 4xx 和 5xx 错误上引发异常。
相反,可以通过返回的 state code 及其 status code 来检测此类错误。RestTemplate
ResponseEntity
Spring Framework 5.0 提供了一个适用于 WebFlux 集成测试以及 WebFlux 和 MVC 端到端测试的新功能。
它为断言提供了流畅的 API,这与 .WebTestClient TestRestTemplate |
建议使用 Apache HTTP 客户端(版本 5.1 或更高版本),但并非强制性要求。
如果你在 Classpath 上有它,则通过适当地配置 Client 端来响应。
如果您确实使用 Apache 的 HTTP 客户端,则会启用一些其他测试友好功能:TestRestTemplate
-
不遵循重定向(因此您可以断言响应位置)。
-
Cookie 将被忽略(因此模板是无状态的)。
TestRestTemplate
可以直接在集成测试中实例化,如以下示例所示:
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
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");
}
}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.boot.test.web.client.TestRestTemplate
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")
}
}
或者,如果将注释与 或 一起使用,则可以注入完全配置的注释并开始使用它。
如有必要,可以通过 Bean 应用其他定制。
任何未指定主机和端口的 URL 都会自动连接到嵌入式服务器,如以下示例所示:@SpringBootTest
WebEnvironment.RANDOM_PORT
WebEnvironment.DEFINED_PORT
TestRestTemplate
RestTemplateBuilder
-
Java
-
Kotlin
import java.time.Duration;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpHeaders;
import static org.assertj.core.api.Assertions.assertThat;
@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));
}
}
}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.boot.test.web.client.TestRestTemplate
import org.springframework.boot.web.client.RestTemplateBuilder
import org.springframework.context.annotation.Bean
import java.time.Duration
@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))
}
}
}
Spring Framework 5.0 提供了一个适用于 WebFlux 集成测试以及 WebFlux 和 MVC 端到端测试的新功能。
它为断言提供了流畅的 API,这与 .WebTestClient TestRestTemplate |