此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.4! |
Spring Boot 应用程序是 Spring ,因此除了通常使用普通 Spring 上下文所做的操作之外,无需执行任何特别操作来测试它。ApplicationContext
默认情况下,Spring Boot 的外部属性、日志记录和其他功能仅在用于创建它时才会安装在上下文中。SpringApplication |
Spring Boot 提供了一个 Comments,当您需要 Spring Boot 功能时,可以将其用作标准 Comments 的替代方法。
Comments 的工作原理是通过 SpringApplication
创建测试中使用的ApplicationContext
。
除了许多其他注释之外,还提供了用于测试应用程序的更具体切片的注释。@SpringBootTest
spring-test
@ContextConfiguration
@SpringBootTest
如果您使用的是 JUnit 4,请不要忘记也添加到您的测试中,否则注释将被忽略。
如果您使用的是 JUnit 5,则无需添加等效的 as,并且其他注释已经使用它进行了注释。@RunWith(SpringRunner.class) @ExtendWith(SpringExtension.class) @SpringBootTest @…Test |
默认情况下,不会启动服务器。
您可以使用 的 属性 of 进一步优化测试的运行方式:@SpringBootTest
webEnvironment
@SpringBootTest
-
MOCK
(默认) :加载 Web 并提供模拟 Web 环境。 使用此注释时,嵌入式服务器不会启动。 如果 Web 环境在 Classpath 上不可用,则此模式透明地回退到创建常规的 non-web 。 它可以与@AutoConfigureMockMvc
或@AutoConfigureWebTestClient
结合使用,以便对 Web 应用程序进行基于模拟的测试。ApplicationContext
ApplicationContext
-
RANDOM_PORT
:加载 并提供真实的 Web 环境。 嵌入式服务器启动并侦听随机端口。WebServerApplicationContext
-
DEFINED_PORT
:加载 并提供真实的 Web 环境。 嵌入式服务器启动并侦听定义的端口(来自 )或默认端口 。WebServerApplicationContext
application.properties
8080
-
NONE
:使用 但不提供任何 Web 环境(模拟或其他)加载。ApplicationContext
SpringApplication
如果您的测试是 ,则默认情况下,它会在每个测试方法结束时回滚事务。
但是,由于将这种安排与 OR 一起使用会隐式提供真实的 servlet 环境,因此 HTTP 客户端和服务器在单独的线程中运行,因此在单独的事务中运行。
在这种情况下,在服务器上启动的任何事务都不会回滚。@Transactional RANDOM_PORT DEFINED_PORT |
@SpringBootTest 如果您的应用程序对 Management Server 使用不同的端口,则 with 还将在单独的随机端口上启动 Management Server。webEnvironment = WebEnvironment.RANDOM_PORT |
默认情况下,Spring Boot 的外部属性、日志记录和其他功能仅在用于创建它时才会安装在上下文中。SpringApplication |
如果您使用的是 JUnit 4,请不要忘记也添加到您的测试中,否则注释将被忽略。
如果您使用的是 JUnit 5,则无需添加等效的 as,并且其他注释已经使用它进行了注释。@RunWith(SpringRunner.class) @ExtendWith(SpringExtension.class) @SpringBootTest @…Test |
如果您的测试是 ,则默认情况下,它会在每个测试方法结束时回滚事务。
但是,由于将这种安排与 OR 一起使用会隐式提供真实的 servlet 环境,因此 HTTP 客户端和服务器在单独的线程中运行,因此在单独的事务中运行。
在这种情况下,在服务器上启动的任何事务都不会回滚。@Transactional RANDOM_PORT DEFINED_PORT |
@SpringBootTest 如果您的应用程序对 Management Server 使用不同的端口,则 with 还将在单独的随机端口上启动 Management Server。webEnvironment = WebEnvironment.RANDOM_PORT |
检测 Web 应用程序类型
如果 Spring MVC 可用,则配置基于常规 MVC 的应用程序上下文。 如果您只有 Spring WebFlux,我们将检测到该情况并配置基于 WebFlux 的应用程序上下文。
如果两者都存在,则 Spring MVC 优先。
如果要在此场景中测试反应式 Web 应用程序,则必须设置以下属性:spring.main.web-application-type
-
Java
-
Kotlin
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(properties = "spring.main.web-application-type=reactive")
class MyWebFluxTests {
// ...
}
import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest(properties = ["spring.main.web-application-type=reactive"])
class MyWebFluxTests {
// ...
}
检测测试配置
如果您熟悉 Spring Test Framework,则可能习惯于使用来指定要加载的 Spring。
或者,您可能经常在测试中使用嵌套类。@ContextConfiguration(classes=…)
@Configuration
@Configuration
在测试 Spring Boot 应用程序时,这通常不是必需的。
Spring Boot 的 Comments 会在您未明确定义主配置时自动搜索主配置。@*Test
搜索算法从包含测试的包开始工作,直到找到带有 或 注释的类。
只要你以合理的方式构建你的代码,你的主要配置通常会被找到。@SpringBootApplication
@SpringBootConfiguration
如果使用 test annotation 来测试应用程序的更具体部分,则应避免在 main 方法的 application 类上添加特定于特定区域的配置设置。 的底层组件扫描配置定义了用于确保切片按预期工作的排除过滤器。
如果您在 -annotated 类上使用 explicit 指令,请注意这些过滤器将被禁用。
如果您正在使用切片,则应再次定义它们。 |
如果要自定义主配置,可以使用嵌套类。
与嵌套类不同,嵌套类将用于代替应用程序的主配置,而嵌套类则除了应用程序的主配置外,还使用嵌套类。@TestConfiguration
@Configuration
@TestConfiguration
Spring 的测试框架在测试之间缓存应用程序上下文。 因此,只要您的测试共享相同的配置(无论它是如何发现的),加载上下文的潜在耗时过程只会发生一次。 |
如果使用 test annotation 来测试应用程序的更具体部分,则应避免在 main 方法的 application 类上添加特定于特定区域的配置设置。 的底层组件扫描配置定义了用于确保切片按预期工作的排除过滤器。
如果您在 -annotated 类上使用 explicit 指令,请注意这些过滤器将被禁用。
如果您正在使用切片,则应再次定义它们。 |
Spring 的测试框架在测试之间缓存应用程序上下文。 因此,只要您的测试共享相同的配置(无论它是如何发现的),加载上下文的潜在耗时过程只会发生一次。 |
使用 Test Configuration Main 方法
通常,发现的测试配置将是您的主要 。
在大多数结构良好的应用程序中,此 configuration 类还将包括用于启动应用程序的方法。@SpringBootTest
@SpringBootApplication
main
例如,以下是典型 Spring Boot 应用程序的非常常见的 Code Pattern:
-
Java
-
Kotlin
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.docs.using.structuringyourcode.locatingthemainclass.MyApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
在上面的示例中,该方法除了委托 .
但是,可以使用更复杂的方法在调用 .main
SpringApplication.run
main
SpringApplication.run
例如,下面是一个更改横幅模式并设置其他配置文件的应用程序:
-
Java
-
Kotlin
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.setBannerMode(Banner.Mode.OFF);
application.setAdditionalProfiles("myprofile");
application.run(args);
}
}
import org.springframework.boot.Banner
import org.springframework.boot.runApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
@SpringBootApplication
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args) {
setBannerMode(Banner.Mode.OFF)
setAdditionalProfiles("myprofile")
}
}
由于方法中的自定义可能会影响结果,因此您可能还希望使用该方法在测试中创建 used。
默认情况下,不会调用您的方法,而是直接使用类本身来创建main
ApplicationContext
main
ApplicationContext
@SpringBootTest
main
ApplicationContext
如果要更改此行为,可以将 的属性更改为 或 。
设置为 时,如果找不到方法,则测试将失败。
设置为 时,如果可用,则使用方法,否则将使用标准加载机制。useMainMethod
@SpringBootTest
UseMainMethod.ALWAYS
UseMainMethod.WHEN_AVAILABLE
ALWAYS
main
WHEN_AVAILABLE
main
例如,以下测试将调用 of 的方法以创建 .
如果 main 方法设置了其他配置文件,则这些配置文件将在启动时处于活动状态。main
MyApplication
ApplicationContext
ApplicationContext
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.UseMainMethod;
@SpringBootTest(useMainMethod = UseMainMethod.ALWAYS)
class MyApplicationTests {
@Test
void exampleTest() {
// ...
}
}
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.UseMainMethod
@SpringBootTest(useMainMethod = UseMainMethod.ALWAYS)
class MyApplicationTests {
@Test
fun exampleTest() {
// ...
}
}
排除测试配置
如果您的应用程序使用组件扫描(例如,如果您使用 或 ),您可能会发现仅为特定测试创建的顶级配置类会意外地随处可见。@SpringBootApplication
@ComponentScan
正如我们之前看到的,可以用于测试的内部类来自定义主要配置。 也可以在顶级类上使用。这样做表示不应通过扫描来选取该类。
然后,您可以在需要的地方显式导入该类,如以下示例所示:@TestConfiguration
@TestConfiguration
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
@SpringBootTest
@Import(MyTestsConfiguration.class)
class MyTests {
@Test
void exampleTest() {
// ...
}
}
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.annotation.Import
@SpringBootTest
@Import(MyTestsConfiguration::class)
class MyTests {
@Test
fun exampleTest() {
// ...
}
}
如果直接使用 (即,不是通过 ),则需要向 它注册 。
有关详细信息,请参阅 API 文档。@ComponentScan @SpringBootApplication TypeExcludeFilter TypeExcludeFilter |
导入的 an 比 inner-class 更早处理,而 imported 将在通过组件扫描找到任何配置之前处理。
一般来说,这种 Sequences 的差异没有明显的影响,但是如果你依赖于 bean 覆盖,则需要注意这一点。@TestConfiguration @TestConfiguration @TestConfiguration |
如果直接使用 (即,不是通过 ),则需要向 它注册 。
有关详细信息,请参阅 API 文档。@ComponentScan @SpringBootApplication TypeExcludeFilter TypeExcludeFilter |
导入的 an 比 inner-class 更早处理,而 imported 将在通过组件扫描找到任何配置之前处理。
一般来说,这种 Sequences 的差异没有明显的影响,但是如果你依赖于 bean 覆盖,则需要注意这一点。@TestConfiguration @TestConfiguration @TestConfiguration |
使用应用程序参数
如果您的应用程序需要参数,则可以
使用 attribute 注入它们。@SpringBootTest
args
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(args = "--app.test=one")
class MyApplicationArgumentTests {
@Test
void applicationArgumentsPopulated(@Autowired ApplicationArguments args) {
assertThat(args.getOptionNames()).containsOnly("app.test");
assertThat(args.getOptionValues("app.test")).containsOnly("one");
}
}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.test.context.SpringBootTest
@SpringBootTest(args = ["--app.test=one"])
class MyApplicationArgumentTests {
@Test
fun applicationArgumentsPopulated(@Autowired args: ApplicationArguments) {
assertThat(args.optionNames).containsOnly("app.test")
assertThat(args.getOptionValues("app.test")).containsOnly("one")
}
}
使用 Mock 环境进行测试
默认情况下,不会启动服务器,而是设置用于测试 Web 端点的模拟环境。@SpringBootTest
借助 Spring MVC,我们可以使用 MockMvc
查询我们的 Web 端点。
有三种集成可用:
-
使用 Hamcrest 的常规
MockMvc
。 -
MockMvcTester
来包装并使用 AssertJ。MockMvc
-
WebTestClient
作为服务器插入以处理请求。MockMvc
以下示例展示了可用的集成:
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.assertj.MockMvcTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@AutoConfigureMockMvc
class MyMockMvcTests {
@Test
void testWithMockMvc(@Autowired MockMvc mvc) throws Exception {
mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string("Hello World"));
}
// If AssertJ is on the classpath, you can use MockMvcTester
@Test
void testWithMockMvcTester(@Autowired MockMvcTester mvc) {
assertThat(mvc.get().uri("/")).hasStatusOk().hasBodyTextEqualTo("Hello World");
}
// If Spring WebFlux is on the classpath, you can drive MVC tests with a WebTestClient
@Test
void testWithWebTestClient(@Autowired WebTestClient webClient) {
webClient
.get().uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Hello World");
}
}
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.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody
import org.springframework.test.web.servlet.assertj.MockMvcTester
@SpringBootTest
@AutoConfigureMockMvc
class MyMockMvcTests {
@Test
fun testWithMockMvc(@Autowired mvc: MockMvcTester) {
assertThat(mvc.get().uri("/")).hasStatusOk()
.hasBodyTextEqualTo("Hello World")
}
// If Spring WebFlux is on the classpath, you can drive MVC tests with a WebTestClient
@Test
fun testWithWebTestClient(@Autowired webClient: WebTestClient) {
webClient
.get().uri("/")
.exchange()
.expectStatus().isOk
.expectBody<String>().isEqualTo("Hello World")
}
}
如果您只想关注 Web 图层,而不开始 完整 ,请考虑改用 @WebMvcTest 。ApplicationContext |
使用 Spring WebFlux 端点,你可以使用WebTestClient
,如以下示例所示:
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;
@SpringBootTest
@AutoConfigureWebTestClient
class MyMockWebTestClientTests {
@Test
void exampleTest(@Autowired WebTestClient webClient) {
webClient
.get().uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Hello World");
}
}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody
@SpringBootTest
@AutoConfigureWebTestClient
class MyMockWebTestClientTests {
@Test
fun exampleTest(@Autowired webClient: WebTestClient) {
webClient
.get().uri("/")
.exchange()
.expectStatus().isOk
.expectBody<String>().isEqualTo("Hello World")
}
}
在模拟环境中进行测试通常比使用完整的 servlet 容器运行更快。 但是,由于模拟发生在 Spring MVC 层,因此无法直接使用 MockMvc 测试依赖于较低级别 servlet 容器行为的代码。 例如, Spring Boot 的错误处理基于 servlet 容器提供的“错误页面”支持。 这意味着,虽然您可以测试 MVC 层是否按预期引发和处理异常,但不能直接测试是否呈现了特定的自定义错误页面。 如果需要测试这些较低级别的问题,可以按照下一节所述启动完全运行的服务器。 |
如果您只想关注 Web 图层,而不开始 完整 ,请考虑改用 @WebMvcTest 。ApplicationContext |
在模拟环境中进行测试通常比使用完整的 servlet 容器运行更快。 但是,由于模拟发生在 Spring MVC 层,因此无法直接使用 MockMvc 测试依赖于较低级别 servlet 容器行为的代码。 例如, Spring Boot 的错误处理基于 servlet 容器提供的“错误页面”支持。 这意味着,虽然您可以测试 MVC 层是否按预期引发和处理异常,但不能直接测试是否呈现了特定的自定义错误页面。 如果需要测试这些较低级别的问题,可以按照下一节所述启动完全运行的服务器。 |
使用正在运行的服务器进行测试
如果您需要启动一个完全运行的服务器,我们建议您使用随机端口。
如果使用 ,则每次运行测试时都会随机选择一个可用端口。@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
该 annotation 可用于将实际使用的端口注入到测试中。
为方便起见,需要对已启动的服务器进行 REST 调用的测试还可以自动连接 WebTestClient
,该客户端解析到正在运行的服务器的相对链接,并附带一个用于验证响应的专用 API,如以下示例所示:@LocalServerPort
-
Java
-
Kotlin
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.test.web.reactive.server.WebTestClient;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyRandomPortWebTestClientTests {
@Test
void exampleTest(@Autowired WebTestClient webClient) {
webClient
.get().uri("/")
.exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Hello World");
}
}
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.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyRandomPortWebTestClientTests {
@Test
fun exampleTest(@Autowired webClient: WebTestClient) {
webClient
.get().uri("/")
.exchange()
.expectStatus().isOk
.expectBody<String>().isEqualTo("Hello World")
}
}
WebTestClient 还可以与模拟环境一起使用,无需运行服务器,方法是使用 .@AutoConfigureWebTestClient |
此设置需要在 classpath 上。
如果你不能或不打算添加 webflux,Spring Boot 还提供了一个工具:spring-webflux
TestRestTemplate
-
Java
-
Kotlin
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.web.client.TestRestTemplate;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyRandomPortTestRestTemplateTests {
@Test
void exampleTest(@Autowired TestRestTemplate restTemplate) {
String body = restTemplate.getForObject("/", String.class);
assertThat(body).isEqualTo("Hello World");
}
}
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.web.client.TestRestTemplate
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyRandomPortTestRestTemplateTests {
@Test
fun exampleTest(@Autowired restTemplate: TestRestTemplate) {
val body = restTemplate.getForObject("/", String::class.java)
assertThat(body).isEqualTo("Hello World")
}
}
WebTestClient 还可以与模拟环境一起使用,无需运行服务器,方法是使用 .@AutoConfigureWebTestClient |
自定义 WebTestClient
要自定义 Bean,请配置 Bean。
任何此类 bean 都使用用于创建 的 调用。WebTestClient
WebTestClientBuilderCustomizer
WebTestClient.Builder
WebTestClient
使用 JMX
由于测试上下文框架会缓存上下文,因此默认情况下会禁用 JMX,以防止相同的组件在同一域上注册。
如果此类测试需要访问 ,则还要考虑将其标记为 dirty:MBeanServer
-
Java
-
Kotlin
import javax.management.MBeanServer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(properties = "spring.jmx.enabled=true")
@DirtiesContext
class MyJmxTests {
@Autowired
private MBeanServer mBeanServer;
@Test
void exampleTest() {
assertThat(this.mBeanServer.getDomains()).contains("java.lang");
// ...
}
}
import javax.management.MBeanServer
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.test.annotation.DirtiesContext
@SpringBootTest(properties = ["spring.jmx.enabled=true"])
@DirtiesContext
class MyJmxTests(@Autowired val mBeanServer: MBeanServer) {
@Test
fun exampleTest() {
assertThat(mBeanServer.domains).contains("java.lang")
// ...
}
}
使用观测
如果使用 注释切片测试,它会自动配置一个 .@AutoConfigureObservability
ObservationRegistry
使用度量
无论您的 Classpath 如何,在使用 时,不会自动配置计量注册表(内存中支持的除外)。@SpringBootTest
如果需要将指标导出到其他后端作为集成测试的一部分,请使用 .@AutoConfigureObservability
如果使用 注释切片测试,则会自动配置内存中的 .
注释不支持在切片测试中导出数据。@AutoConfigureObservability
MeterRegistry
@AutoConfigureObservability
使用跟踪
无论您的 Classpath 如何,使用 时,不会自动配置报告数据的跟踪组件。@SpringBootTest
如果您需要这些组件作为集成测试的一部分,请使用 .@AutoConfigureObservability
如果您已创建自己的报表组件(例如自定义 或 ),并且不希望它们在测试中处于活动状态,则可以使用注释来禁用它们。SpanExporter
SpanHandler
@ConditionalOnEnabledTracing
如果使用 注释切片测试,则会自动配置 no-op 。
注释不支持在切片测试中导出数据。@AutoConfigureObservability
Tracer
@AutoConfigureObservability
嘲笑和监视 Bean
运行测试时,有时需要模拟应用程序上下文中的某些组件。 例如,您可能在某些远程服务上有一个在开发过程中不可用的门面。 当您想要模拟在真实环境中可能难以触发的故障时,模拟也很有用。
Spring Framework 包含一个注释,可用于为 .
此外,还可用于定义 Mockito 间谍。
在 Spring Framework 文档中了解有关这些功能的更多信息。@MockitoBean
ApplicationContext
@MockitoSpyBean
自动配置的测试
Spring Boot 的自动配置系统适用于应用程序,但有时对于测试来说可能有点太多了。 通常,仅加载测试应用程序的 “slice” 所需的配置部分会有所帮助。 例如,你可能想要测试 Spring MVC 控制器是否正确映射 URL,并且你不想在这些测试中涉及数据库调用,或者你可能想要测试 JPA 实体,并且你对这些测试运行时的 Web 层不感兴趣。
该模块包含许多可用于自动配置此类 “切片” 的 Comments。
它们中的每一个都以类似的方式工作,提供一个用于加载 的注释,以及一个或多个可用于自定义自动配置设置的注释。spring-boot-test-autoconfigure
@…Test
ApplicationContext
@AutoConfigure…
每个 slice 将组件扫描限制为适当的组件,并加载一组非常受限的 auto-configuration classes。
如果需要排除其中一个,大多数 Comments 都会提供一个属性。
或者,您也可以使用 .@…Test excludeAutoConfiguration @ImportAutoConfiguration#exclude |
不支持在一个测试中使用多个 Comments 来包含多个 “slice”。
如果您需要多个 “切片”,请选择其中一个注释并手动包含其他 “切片” 的注释。@…Test @…Test @AutoConfigure… |
也可以将 Comments 与标准注释一起使用。
如果您对 “切片” 应用程序不感兴趣,但想要一些自动配置的测试 bean,则可以使用此组合。@AutoConfigure… @SpringBootTest |
每个 slice 将组件扫描限制为适当的组件,并加载一组非常受限的 auto-configuration classes。
如果需要排除其中一个,大多数 Comments 都会提供一个属性。
或者,您也可以使用 .@…Test excludeAutoConfiguration @ImportAutoConfiguration#exclude |
不支持在一个测试中使用多个 Comments 来包含多个 “slice”。
如果您需要多个 “切片”,请选择其中一个注释并手动包含其他 “切片” 的注释。@…Test @…Test @AutoConfigure… |
也可以将 Comments 与标准注释一起使用。
如果您对 “切片” 应用程序不感兴趣,但想要一些自动配置的测试 bean,则可以使用此组合。@AutoConfigure… @SpringBootTest |
自动配置的 JSON 测试
要测试对象 JSON 序列化和反序列化是否按预期工作,您可以使用注释。 自动配置可用的受支持 JSON 映射器,该映射器可以是以下库之一:@JsonTest
@JsonTest
-
Jackson,任何豆子和任何 Jackson s
ObjectMapper
@JsonComponent
Module
-
Gson
-
Jsonb
附录中提供了 启用的自动配置列表。@JsonTest |
如果需要配置自动配置的元素,则可以使用 annotation.@AutoConfigureJsonTesters
Spring Boot 包括基于 AssertJ 的帮助程序,这些帮助程序与 JSONAssert 和 JsonPath 库一起使用,以检查 JSON 是否按预期显示。
、、 、 和 类可以分别用于 Jackson、 Gson、 Jsonb 和 Strings。
测试类上的任何帮助程序字段都可以在使用 .
以下示例显示了 Jackson 的 test 类:JacksonTester
GsonTester
JsonbTester
BasicJsonTester
@Autowired
@JsonTest
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.JsonTest;
import org.springframework.boot.test.json.JacksonTester;
import static org.assertj.core.api.Assertions.assertThat;
@JsonTest
class MyJsonTests {
@Autowired
private JacksonTester<VehicleDetails> json;
@Test
void serialize() throws Exception {
VehicleDetails details = new VehicleDetails("Honda", "Civic");
// Assert against a `.json` file in the same package as the test
assertThat(this.json.write(details)).isEqualToJson("expected.json");
// Or use JSON path based assertions
assertThat(this.json.write(details)).hasJsonPathStringValue("@.make");
assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make").isEqualTo("Honda");
}
@Test
void deserialize() throws Exception {
String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
assertThat(this.json.parse(content)).isEqualTo(new VehicleDetails("Ford", "Focus"));
assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford");
}
}
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.autoconfigure.json.JsonTest
import org.springframework.boot.test.json.JacksonTester
@JsonTest
class MyJsonTests(@Autowired val json: JacksonTester<VehicleDetails>) {
@Test
fun serialize() {
val details = VehicleDetails("Honda", "Civic")
// Assert against a `.json` file in the same package as the test
assertThat(json.write(details)).isEqualToJson("expected.json")
// Or use JSON path based assertions
assertThat(json.write(details)).hasJsonPathStringValue("@.make")
assertThat(json.write(details)).extractingJsonPathStringValue("@.make").isEqualTo("Honda")
}
@Test
fun deserialize() {
val content = "{\"make\":\"Ford\",\"model\":\"Focus\"}"
assertThat(json.parse(content)).isEqualTo(VehicleDetails("Ford", "Focus"))
assertThat(json.parseObject(content).make).isEqualTo("Ford")
}
}
JSON 帮助程序类也可以直接在标准单元测试中使用。
为此,如果不使用 ,请在您的方法中调用帮助程序的方法。initFields @Before @JsonTest |
如果使用 Spring Boot 基于 AssertJ 的帮助程序在给定 JSON 路径上的数字值上断言,则可能无法使用,具体取决于类型。
相反,您可以使用 AssertJ 来断言该值与给定条件匹配。
例如,以下示例断言实际数字是接近偏移量 的 float 值。isEqualTo
satisfies
0.15
0.01
-
Java
-
Kotlin
@Test
void someTest() throws Exception {
SomeObject value = new SomeObject(0.152f);
assertThat(this.json.write(value)).extractingJsonPathNumberValue("@.test.numberValue")
.satisfies((number) -> assertThat(number.floatValue()).isCloseTo(0.15f, within(0.01f)));
}
@Test
fun someTest() {
val value = SomeObject(0.152f)
assertThat(json.write(value)).extractingJsonPathNumberValue("@.test.numberValue")
.satisfies(ThrowingConsumer { number ->
assertThat(number.toFloat()).isCloseTo(0.15f, within(0.01f))
})
}
附录中提供了 启用的自动配置列表。@JsonTest |
JSON 帮助程序类也可以直接在标准单元测试中使用。
为此,如果不使用 ,请在您的方法中调用帮助程序的方法。initFields @Before @JsonTest |
自动配置的 Spring MVC 测试
要测试 Spring MVC 控制器是否按预期工作,请使用 Comments。 自动配置 Spring MVC 基础结构,并将扫描的 bean 限制为 、 和 。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@WebMvcTest
@WebMvcTest
@Controller
@ControllerAdvice
@JsonComponent
Converter
GenericConverter
Filter
HandlerInterceptor
WebMvcConfigurer
WebMvcRegistrations
HandlerMethodArgumentResolver
@Component
@ConfigurationProperties
@WebMvcTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@WebMvcTest |
如果需要注册额外的组件,例如 Jackson ,则可以在测试中使用导入其他配置类。Module @Import |
通常,仅限于单个控制器,并结合使用,为所需的协作者提供模拟实现。@WebMvcTest
@MockBean
@WebMvcTest
还自动配置 .
Mock MVC 提供了一种强大的方法来快速测试 MVC 控制器,而无需启动完整的 HTTP 服务器。
如果 AssertJ 可用,则 提供的 AssertJ 支持也会自动配置。MockMvc
MockMvcTester
您还可以通过在非 - (如 )中自动配置 and,方法是使用 .
以下示例使用 :MockMvc MockMvcTester @WebMvcTest @SpringBootTest @AutoConfigureMockMvc MockMvcTester |
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.assertj.MockMvcTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
@WebMvcTest(UserVehicleController.class)
class MyControllerTests {
@Autowired
private MockMvcTester mvc;
@MockitoBean
private UserVehicleService userVehicleService;
@Test
void testExample() {
given(this.userVehicleService.getVehicleDetails("sboot"))
.willReturn(new VehicleDetails("Honda", "Civic"));
assertThat(this.mvc.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
.hasStatusOk()
.hasBodyTextEqualTo("Honda Civic");
}
}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.mockito.BDDMockito.given
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.http.MediaType
import org.springframework.test.context.bean.override.mockito.MockitoBean
import org.springframework.test.web.servlet.assertj.MockMvcTester
@WebMvcTest(UserVehicleController::class)
class MyControllerTests(@Autowired val mvc: MockMvcTester) {
@MockitoBean
lateinit var userVehicleService: UserVehicleService
@Test
fun testExample() {
given(userVehicleService.getVehicleDetails("sboot"))
.willReturn(VehicleDetails("Honda", "Civic"))
assertThat(mvc.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
.hasStatusOk().hasBodyTextEqualTo("Honda Civic")
}
}
如果需要配置自动配置的元素(例如,何时应应用 servlet 过滤器),则可以在 Comments 中使用属性。@AutoConfigureMockMvc |
如果使用 HtmlUnit 和 Selenium,则自动配置还会提供 HtmlUnit bean 和/或 Selenium bean。
下面的示例使用 HtmlUnit:WebClient
WebDriver
-
Java
-
Kotlin
import org.htmlunit.WebClient;
import org.htmlunit.html.HtmlPage;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
@WebMvcTest(UserVehicleController.class)
class MyHtmlUnitTests {
@Autowired
private WebClient webClient;
@MockitoBean
private UserVehicleService userVehicleService;
@Test
void testExample() throws Exception {
given(this.userVehicleService.getVehicleDetails("sboot")).willReturn(new VehicleDetails("Honda", "Civic"));
HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic");
}
}
import org.assertj.core.api.Assertions.assertThat
import org.htmlunit.WebClient
import org.htmlunit.html.HtmlPage
import org.junit.jupiter.api.Test
import org.mockito.BDDMockito.given
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.test.context.bean.override.mockito.MockitoBean
@WebMvcTest(UserVehicleController::class)
class MyHtmlUnitTests(@Autowired val webClient: WebClient) {
@MockitoBean
lateinit var userVehicleService: UserVehicleService
@Test
fun testExample() {
given(userVehicleService.getVehicleDetails("sboot")).willReturn(VehicleDetails("Honda", "Civic"))
val page = webClient.getPage<HtmlPage>("/sboot/vehicle.html")
assertThat(page.body.textContent).isEqualTo("Honda Civic")
}
}
默认情况下, Spring Boot 将 bean 放在一个特殊的“范围”中,以确保驱动程序在每次测试后退出并注入新实例。
如果您不希望此行为,可以添加到您的定义中。WebDriver @Scope("singleton") WebDriver @Bean |
Spring Boot 创建的范围将替换任何用户定义的同名范围。
如果您定义自己的范围,您可能会发现它在使用 .webDriver webDriver @WebMvcTest |
如果您在 Classpath 上安装了 Spring Security,则还将扫描 bean。
您可以使用 Spring Security 的测试支持,而不是完全禁用此类测试的安全性。
有关如何使用 Spring Security 支持的更多详细信息,请参阅此 Testing With Spring Security “操作指南”部分。@WebMvcTest
WebSecurityConfigurer
MockMvc
有时编写 Spring MVC 测试是不够的;Spring Boot 可以帮助您使用实际服务器运行完整的端到端测试。 |
附录中提供了启用的自动配置设置的列表。@WebMvcTest |
如果需要注册额外的组件,例如 Jackson ,则可以在测试中使用导入其他配置类。Module @Import |
您还可以通过在非 - (如 )中自动配置 and,方法是使用 .
以下示例使用 :MockMvc MockMvcTester @WebMvcTest @SpringBootTest @AutoConfigureMockMvc MockMvcTester |
如果需要配置自动配置的元素(例如,何时应应用 servlet 过滤器),则可以在 Comments 中使用属性。@AutoConfigureMockMvc |
默认情况下, Spring Boot 将 bean 放在一个特殊的“范围”中,以确保驱动程序在每次测试后退出并注入新实例。
如果您不希望此行为,可以添加到您的定义中。WebDriver @Scope("singleton") WebDriver @Bean |
Spring Boot 创建的范围将替换任何用户定义的同名范围。
如果您定义自己的范围,您可能会发现它在使用 .webDriver webDriver @WebMvcTest |
有时编写 Spring MVC 测试是不够的;Spring Boot 可以帮助您使用实际服务器运行完整的端到端测试。 |
自动配置的 Spring WebFlux 测试
要测试 Spring WebFlux 控制器是否按预期工作,你可以使用 Comments。 自动配置 Spring WebFlux 基础结构,并将扫描的 bean 限制为 、 和 。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@WebFluxTest
@WebFluxTest
@Controller
@ControllerAdvice
@JsonComponent
Converter
GenericConverter
WebFilter
WebFluxConfigurer
@Component
@ConfigurationProperties
@WebFluxTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了 启用的自动配置列表。@WebFluxTest |
如果需要注册额外的组件,例如 Jackson ,则可以使用 on your test 导入其他配置类。Module @Import |
通常,仅限于单个控制器,并与 annotation 结合使用,为所需的协作者提供 mock 实现。@WebFluxTest
@MockBean
@WebFluxTest
还自动配置了 WebTestClient
,它提供了一种强大的方法来快速测试 WebFlux 控制器,而无需启动完整的 HTTP 服务器。
您还可以在非 - (例如 ) 中自动配置,方法是使用 .
以下示例显示了一个同时使用 和 a 的类:WebTestClient @WebFluxTest @SpringBootTest @AutoConfigureWebTestClient @WebFluxTest WebTestClient |
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.reactive.server.WebTestClient;
import static org.mockito.BDDMockito.given;
@WebFluxTest(UserVehicleController.class)
class MyControllerTests {
@Autowired
private WebTestClient webClient;
@MockitoBean
private UserVehicleService userVehicleService;
@Test
void testExample() {
given(this.userVehicleService.getVehicleDetails("sboot"))
.willReturn(new VehicleDetails("Honda", "Civic"));
this.webClient.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN).exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("Honda Civic");
}
}
import org.junit.jupiter.api.Test
import org.mockito.BDDMockito.given
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest
import org.springframework.http.MediaType
import org.springframework.test.context.bean.override.mockito.MockitoBean
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody
@WebFluxTest(UserVehicleController::class)
class MyControllerTests(@Autowired val webClient: WebTestClient) {
@MockitoBean
lateinit var userVehicleService: UserVehicleService
@Test
fun testExample() {
given(userVehicleService.getVehicleDetails("sboot"))
.willReturn(VehicleDetails("Honda", "Civic"))
webClient.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN).exchange()
.expectStatus().isOk
.expectBody<String>().isEqualTo("Honda Civic")
}
}
此设置仅受 WebFlux 应用程序支持,因为在模拟的 Web 应用程序中使用目前仅适用于 WebFlux。WebTestClient |
@WebFluxTest 无法检测通过 Functional Web 框架注册的路由。
要在上下文中测试 bean,请考虑使用 或 using 导入您自己。RouterFunction RouterFunction @Import @SpringBootTest |
@WebFluxTest 无法检测注册为 类型 的自定义安全配置 。
要将其包含在测试中,您需要导入使用 或 using 注册 bean 的配置。@Bean SecurityWebFilterChain @Import @SpringBootTest |
有时编写 Spring WebFlux 测试是不够的;Spring Boot 可以帮助您使用实际服务器运行完整的端到端测试。 |
附录中提供了 启用的自动配置列表。@WebFluxTest |
如果需要注册额外的组件,例如 Jackson ,则可以使用 on your test 导入其他配置类。Module @Import |
您还可以在非 - (例如 ) 中自动配置,方法是使用 .
以下示例显示了一个同时使用 和 a 的类:WebTestClient @WebFluxTest @SpringBootTest @AutoConfigureWebTestClient @WebFluxTest WebTestClient |
此设置仅受 WebFlux 应用程序支持,因为在模拟的 Web 应用程序中使用目前仅适用于 WebFlux。WebTestClient |
@WebFluxTest 无法检测通过 Functional Web 框架注册的路由。
要在上下文中测试 bean,请考虑使用 或 using 导入您自己。RouterFunction RouterFunction @Import @SpringBootTest |
@WebFluxTest 无法检测注册为 类型 的自定义安全配置 。
要将其包含在测试中,您需要导入使用 或 using 注册 bean 的配置。@Bean SecurityWebFilterChain @Import @SpringBootTest |
有时编写 Spring WebFlux 测试是不够的;Spring Boot 可以帮助您使用实际服务器运行完整的端到端测试。 |
自动配置的 Spring GraphQL 测试
Spring GraphQL 提供了一个专用的测试支持模块;您需要将其添加到您的项目中:
<dependencies>
<dependency>
<groupId>org.springframework.graphql</groupId>
<artifactId>spring-graphql-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Unless already present in the compile scope -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
dependencies {
testImplementation("org.springframework.graphql:spring-graphql-test")
// Unless already present in the implementation configuration
testImplementation("org.springframework.boot:spring-boot-starter-webflux")
}
此测试模块附带 GraphQlTester。
测试器在测试中被大量使用,因此请务必熟悉它的使用。
有一些变体,Spring Boot 将根据测试类型自动配置它们:GraphQlTester
-
在服务器端执行测试,没有客户端或传输
ExecutionGraphQlServiceTester
-
使用连接到服务器的客户端执行测试,无论是否有实时服务器
HttpGraphQlTester
Spring Boot 可帮助您使用注释测试 Spring GraphQL 控制器。 自动配置 Spring GraphQL 基础设施,无需任何传输或服务器。
这会将扫描的 bean 限制为 、 和 。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@GraphQlTest
@GraphQlTest
@Controller
RuntimeWiringConfigurer
JsonComponent
Converter
GenericConverter
DataFetcherExceptionResolver
Instrumentation
GraphQlSourceBuilderCustomizer
@Component
@ConfigurationProperties
@GraphQlTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了 启用的自动配置列表。@GraphQlTest |
通常,仅限于一组控制器,并与 annotation 结合使用,为所需的协作者提供 mock 实现。@GraphQlTest
@MockBean
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.docs.web.graphql.runtimewiring.GreetingController;
import org.springframework.boot.test.autoconfigure.graphql.GraphQlTest;
import org.springframework.graphql.test.tester.GraphQlTester;
@GraphQlTest(GreetingController.class)
class GreetingControllerTests {
@Autowired
private GraphQlTester graphQlTester;
@Test
void shouldGreetWithSpecificName() {
this.graphQlTester.document("{ greeting(name: \"Alice\") } ")
.execute()
.path("greeting")
.entity(String.class)
.isEqualTo("Hello, Alice!");
}
@Test
void shouldGreetWithDefaultName() {
this.graphQlTester.document("{ greeting } ")
.execute()
.path("greeting")
.entity(String.class)
.isEqualTo("Hello, Spring!");
}
}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.docs.web.graphql.runtimewiring.GreetingController
import org.springframework.boot.test.autoconfigure.graphql.GraphQlTest
import org.springframework.graphql.test.tester.GraphQlTester
@GraphQlTest(GreetingController::class)
internal class GreetingControllerTests {
@Autowired
lateinit var graphQlTester: GraphQlTester
@Test
fun shouldGreetWithSpecificName() {
graphQlTester.document("{ greeting(name: \"Alice\") } ").execute().path("greeting").entity(String::class.java)
.isEqualTo("Hello, Alice!")
}
@Test
fun shouldGreetWithDefaultName() {
graphQlTester.document("{ greeting } ").execute().path("greeting").entity(String::class.java)
.isEqualTo("Hello, Spring!")
}
}
@SpringBootTest
测试是完整的集成测试,涉及整个应用程序。
当使用随机或定义的端口时,将配置一个实时服务器并自动提供一个 bean,以便您可以使用它来测试您的服务器。
配置 MOCK 环境后,您还可以通过使用以下 Comments 来请求测试类 Bean :HttpGraphQlTester
HttpGraphQlTester
@AutoConfigureHttpGraphQlTester
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.graphql.tester.AutoConfigureHttpGraphQlTester;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.graphql.test.tester.HttpGraphQlTester;
@AutoConfigureHttpGraphQlTester
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
class GraphQlIntegrationTests {
@Test
void shouldGreetWithSpecificName(@Autowired HttpGraphQlTester graphQlTester) {
HttpGraphQlTester authenticatedTester = graphQlTester.mutate()
.webTestClient((client) -> client.defaultHeaders((headers) -> headers.setBasicAuth("admin", "ilovespring")))
.build();
authenticatedTester.document("{ greeting(name: \"Alice\") } ")
.execute()
.path("greeting")
.entity(String.class)
.isEqualTo("Hello, Alice!");
}
}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.graphql.tester.AutoConfigureHttpGraphQlTester
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.graphql.test.tester.HttpGraphQlTester
import org.springframework.http.HttpHeaders
import org.springframework.test.web.reactive.server.WebTestClient
@AutoConfigureHttpGraphQlTester
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
class GraphQlIntegrationTests {
@Test
fun shouldGreetWithSpecificName(@Autowired graphQlTester: HttpGraphQlTester) {
val authenticatedTester = graphQlTester.mutate()
.webTestClient { client: WebTestClient.Builder ->
client.defaultHeaders { headers: HttpHeaders ->
headers.setBasicAuth("admin", "ilovespring")
}
}.build()
authenticatedTester.document("{ greeting(name: \"Alice\") } ").execute()
.path("greeting").entity(String::class.java).isEqualTo("Hello, Alice!")
}
}
附录中提供了 启用的自动配置列表。@GraphQlTest |
自动配置的 Data Cassandra 测试
可用于测试 Cassandra 应用程序。
默认情况下,它配置一个 ,扫描类,并配置 Spring Data Cassandra 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。
(有关将 Cassandra 与 Spring Boot 结合使用的更多信息,请参阅 Cassandra。@DataCassandraTest
CassandraTemplate
@Table
@Component
@ConfigurationProperties
@DataCassandraTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataCassandraTest |
以下示例显示了在 Spring Boot 中使用 Cassandra 测试的典型设置:
-
Java
-
Kotlin
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.cassandra.DataCassandraTest;
@DataCassandraTest
class MyDataCassandraTests {
@Autowired
private SomeRepository repository;
}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.data.cassandra.DataCassandraTest
@DataCassandraTest
class MyDataCassandraTests(@Autowired val repository: SomeRepository)
附录中提供了启用的自动配置设置的列表。@DataCassandraTest |
自动配置的数据 Couchbase 测试
您可以使用它来测试 Couchbase 应用程序。
默认情况下,它配置或扫描类,并配置 Spring Data Couchbase 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。
(有关将 Couchbase 与 Spring Boot 一起使用的更多信息,请参阅本章前面的 Couchbase。@DataCouchbaseTest
CouchbaseTemplate
ReactiveCouchbaseTemplate
@Document
@Component
@ConfigurationProperties
@DataCouchbaseTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataCouchbaseTest |
以下示例显示了在 Spring Boot 中使用 Couchbase 测试的典型设置:
-
Java
-
Kotlin
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.couchbase.DataCouchbaseTest;
@DataCouchbaseTest
class MyDataCouchbaseTests {
@Autowired
private SomeRepository repository;
// ...
}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.data.couchbase.DataCouchbaseTest
@DataCouchbaseTest
class MyDataCouchbaseTests(@Autowired val repository: SomeRepository) {
// ...
}
附录中提供了启用的自动配置设置的列表。@DataCouchbaseTest |
自动配置的数据 Elasticsearch 测试
您可以使用它来测试 Elasticsearch 应用程序。
默认情况下,它会配置一个 、 扫描类,并配置 Spring Data Elasticsearch 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。
(有关将 Elasticsearch 与 Spring Boot 结合使用的更多信息,请参阅本章前面的 Elasticsearch。@DataElasticsearchTest
ElasticsearchRestTemplate
@Document
@Component
@ConfigurationProperties
@DataElasticsearchTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataElasticsearchTest |
以下示例显示了在 Spring Boot 中使用 Elasticsearch 测试的典型设置:
-
Java
-
Kotlin
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest;
@DataElasticsearchTest
class MyDataElasticsearchTests {
@Autowired
private SomeRepository repository;
// ...
}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.data.elasticsearch.DataElasticsearchTest
@DataElasticsearchTest
class MyDataElasticsearchTests(@Autowired val repository: SomeRepository) {
// ...
}
附录中提供了启用的自动配置设置的列表。@DataElasticsearchTest |
自动配置的数据 JPA 测试
您可以使用注释来测试 JPA 应用程序。
默认情况下,它会扫描类并配置 Spring Data JPA 存储库。
如果 Classpath 上有嵌入式数据库可用,则它也会配置一个。
默认情况下,通过将属性设置为 SQL 查询来记录 SQL 查询。
可以使用 annotation 的属性禁用此功能。@DataJpaTest
@Entity
spring.jpa.show-sql
true
showSql
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@Component
@ConfigurationProperties
@DataJpaTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataJpaTest |
默认情况下,数据 JPA 测试是事务性的,并在每次测试结束时回滚。 有关更多详细信息,请参阅 Spring Framework Reference Documentation 中的相关部分。 如果这不是您想要的,则可以禁用测试或整个类的事务 management,如下所示:
-
Java
-
Kotlin
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyNonTransactionalTests {
// ...
}
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional
@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyNonTransactionalTests {
// ...
}
数据 JPA 测试还可以注入一个 Bean,它为专为测试设计的标准 JPA 提供了替代方案。TestEntityManager
EntityManager
TestEntityManager 也可以通过添加 .
执行此操作时,请确保您的测试在事务中运行,例如通过添加测试类或方法。@AutoConfigureTestEntityManager @Transactional |
如果您需要,也可以使用 A。
以下示例显示了正在使用的注释:JdbcTemplate
@DataJpaTest
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
class MyRepositoryTests {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository repository;
@Test
void testExample() {
this.entityManager.persist(new User("sboot", "1234"));
User user = this.repository.findByUsername("sboot");
assertThat(user.getUsername()).isEqualTo("sboot");
assertThat(user.getEmployeeNumber()).isEqualTo("1234");
}
}
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.autoconfigure.orm.jpa.DataJpaTest
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager
@DataJpaTest
class MyRepositoryTests(@Autowired val entityManager: TestEntityManager, @Autowired val repository: UserRepository) {
@Test
fun testExample() {
entityManager.persist(User("sboot", "1234"))
val user = repository.findByUsername("sboot")
assertThat(user?.username).isEqualTo("sboot")
assertThat(user?.employeeNumber).isEqualTo("1234")
}
}
内存嵌入式数据库通常适用于测试,因为它们速度很快且不需要任何安装。
但是,如果您希望对实际数据库运行测试,则可以使用 Comments,如以下示例所示:@AutoConfigureTestDatabase
-
Java
-
Kotlin
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class MyRepositoryTests {
// ...
}
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MyRepositoryTests {
// ...
}
附录中提供了启用的自动配置设置的列表。@DataJpaTest |
TestEntityManager 也可以通过添加 .
执行此操作时,请确保您的测试在事务中运行,例如通过添加测试类或方法。@AutoConfigureTestEntityManager @Transactional |
自动配置的 JDBC 测试
@JdbcTest
类似于,但适用于只需要 Spring Data JDBC 而不使用 Spring Data JDBC 的测试。
默认情况下,它会配置一个内存中嵌入式数据库和一个 .
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@DataJpaTest
DataSource
JdbcTemplate
@Component
@ConfigurationProperties
@JdbcTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了 启用的自动配置列表。@JdbcTest |
默认情况下,JDBC 测试是事务性的,并在每个测试结束时回滚。 有关更多详细信息,请参阅 Spring Framework Reference Documentation 中的相关部分。 如果这不是您想要的,则可以为测试或整个类禁用事务管理,如下所示:
-
Java
-
Kotlin
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@JdbcTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyTransactionalTests {
}
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional
@JdbcTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyTransactionalTests
如果您希望测试针对实际数据库运行,则可以像使用 Comments 一样使用 Comments。
(请参阅自动配置的数据 JPA 测试。@AutoConfigureTestDatabase
@DataJpaTest
附录中提供了 启用的自动配置列表。@JdbcTest |
自动配置的数据 JDBC 测试
@DataJdbcTest
类似于,但适用于使用 Spring Data JDBC 存储库的测试。
默认情况下,它配置内存中嵌入式数据库、 和 Spring Data JDBC 存储库。
使用 Comments 时仅扫描子类,不扫描 regular 和 bean。 可用于包含 bean。@JdbcTest
JdbcTemplate
AbstractJdbcConfiguration
@DataJdbcTest
@Component
@ConfigurationProperties
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了 启用的自动配置列表。@DataJdbcTest |
默认情况下,数据 JDBC 测试是事务性的,并在每个测试结束时回滚。 有关更多详细信息,请参阅 Spring Framework Reference Documentation 中的相关部分。 如果这不是您想要的,则可以禁用测试或整个测试类的事务管理,如 JDBC 示例所示。
如果您希望测试针对实际数据库运行,则可以像使用 Comments 一样使用 Comments。
(请参阅自动配置的数据 JPA 测试。@AutoConfigureTestDatabase
@DataJpaTest
附录中提供了 启用的自动配置列表。@DataJdbcTest |
自动配置的数据 R2DBC 测试
@DataR2dbcTest
类似于,但适用于使用 Spring Data R2DBC 存储库的测试。
默认情况下,它配置内存中的嵌入式数据库、 和 Spring Data R2DBC 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@DataJdbcTest
R2dbcEntityTemplate
@Component
@ConfigurationProperties
@DataR2dbcTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了 启用的自动配置列表。@DataR2dbcTest |
默认情况下,Data R2DBC 测试不是事务性的。
如果您希望测试针对实际数据库运行,则可以像使用 Comments 一样使用 Comments。
(请参阅自动配置的数据 JPA 测试。@AutoConfigureTestDatabase
@DataJpaTest
附录中提供了 启用的自动配置列表。@DataR2dbcTest |
自动配置的 jOOQ 测试
您可以以与 jOOQ 相关的测试类似的方式使用。
由于 jOOQ 严重依赖与数据库架构相对应的基于 Java 的架构,因此使用 existing。
如果要将其替换为内存中数据库,可以使用 覆盖这些设置。
(有关将 jOOQ 与 Spring Boot 一起使用的更多信息,请参见使用 jOOQ。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@JooqTest
@JdbcTest
DataSource
@AutoConfigureTestDatabase
@Component
@ConfigurationProperties
@JooqTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了 启用的自动配置列表。@JooqTest |
@JooqTest
配置 .
以下示例显示了正在使用的注释:DSLContext
@JooqTest
-
Java
-
Kotlin
import org.jooq.DSLContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jooq.JooqTest;
@JooqTest
class MyJooqTests {
@Autowired
private DSLContext dslContext;
// ...
}
import org.jooq.DSLContext
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.jooq.JooqTest
@JooqTest
class MyJooqTests(@Autowired val dslContext: DSLContext) {
// ...
}
默认情况下,JOOQ 测试是事务性的,并且在每个测试结束时回滚。 如果这不是您想要的,则可以禁用测试或整个测试类的事务管理,如 JDBC 示例所示。
附录中提供了 启用的自动配置列表。@JooqTest |
自动配置的数据 MongoDB 测试
可用于测试 MongoDB 应用程序。
默认情况下,它会配置一个 、 扫描类,并配置 Spring Data MongoDB 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。
(有关将 MongoDB 与 Spring Boot 结合使用的更多信息,请参阅 MongoDB。@DataMongoTest
MongoTemplate
@Document
@Component
@ConfigurationProperties
@DataMongoTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataMongoTest |
下面的类显示了正在使用的 Annotation:@DataMongoTest
-
Java
-
Kotlin
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.data.mongodb.core.MongoTemplate;
@DataMongoTest
class MyDataMongoDbTests {
@Autowired
private MongoTemplate mongoTemplate;
// ...
}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest
import org.springframework.data.mongodb.core.MongoTemplate
@DataMongoTest
class MyDataMongoDbTests(@Autowired val mongoTemplate: MongoTemplate) {
// ...
}
附录中提供了启用的自动配置设置的列表。@DataMongoTest |
自动配置的数据 Neo4j 测试
您可以使用它来测试 Neo4j 应用程序。
默认情况下,它会扫描类并配置 Spring Data Neo4j 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。
(有关将 Neo4J 与 Spring Boot 结合使用的更多信息,请参阅 Neo4j.)@DataNeo4jTest
@Node
@Component
@ConfigurationProperties
@DataNeo4jTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataNeo4jTest |
以下示例显示了在 Spring Boot 中使用 Neo4J 测试的典型设置:
-
Java
-
Kotlin
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest;
@DataNeo4jTest
class MyDataNeo4jTests {
@Autowired
private SomeRepository repository;
// ...
}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest
@DataNeo4jTest
class MyDataNeo4jTests(@Autowired val repository: SomeRepository) {
// ...
}
默认情况下,Data Neo4j 测试是事务性的,并在每次测试结束时回滚。 有关更多详细信息,请参阅 Spring Framework Reference Documentation 中的相关部分。 如果这不是您想要的,则可以为测试或整个类禁用事务管理,如下所示:
-
Java
-
Kotlin
import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@DataNeo4jTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyDataNeo4jTests {
}
import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional
@DataNeo4jTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyDataNeo4jTests
反应式访问不支持事务性测试。
如果使用此样式,则必须如上所述配置测试。@DataNeo4jTest |
附录中提供了启用的自动配置设置的列表。@DataNeo4jTest |
反应式访问不支持事务性测试。
如果使用此样式,则必须如上所述配置测试。@DataNeo4jTest |
自动配置的数据 Redis 测试
您可以使用它来测试 Redis 应用程序。
默认情况下,它会扫描类并配置 Spring Data Redis 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。
(有关将 Redis 与 Spring Boot 结合使用的更多信息,请参阅 Redis。@DataRedisTest
@RedisHash
@Component
@ConfigurationProperties
@DataRedisTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataRedisTest |
以下示例显示了正在使用的注释:@DataRedisTest
-
Java
-
Kotlin
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest;
@DataRedisTest
class MyDataRedisTests {
@Autowired
private SomeRepository repository;
// ...
}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest
@DataRedisTest
class MyDataRedisTests(@Autowired val repository: SomeRepository) {
// ...
}
附录中提供了启用的自动配置设置的列表。@DataRedisTest |
自动配置的数据 LDAP 测试
可用于测试 LDAP 应用程序。
默认情况下,它会配置内存中的嵌入式 LDAP(如果可用),配置,扫描类,并配置 Spring Data LDAP 存储库。
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。
(有关将 LDAP 与 Spring Boot 结合使用的更多信息,请参见 LDAP。@DataLdapTest
LdapTemplate
@Entry
@Component
@ConfigurationProperties
@DataLdapTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@DataLdapTest |
以下示例显示了正在使用的注释:@DataLdapTest
-
Java
-
Kotlin
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest;
import org.springframework.ldap.core.LdapTemplate;
@DataLdapTest
class MyDataLdapTests {
@Autowired
private LdapTemplate ldapTemplate;
// ...
}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest
import org.springframework.ldap.core.LdapTemplate
@DataLdapTest
class MyDataLdapTests(@Autowired val ldapTemplate: LdapTemplate) {
// ...
}
内存中嵌入式 LDAP 通常适用于测试,因为它速度很快,并且不需要任何开发人员安装。 但是,如果您希望针对实际 LDAP 服务器运行测试,则应排除嵌入式 LDAP 自动配置,如以下示例所示:
-
Java
-
Kotlin
import org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration;
import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest;
@DataLdapTest(excludeAutoConfiguration = EmbeddedLdapAutoConfiguration.class)
class MyDataLdapTests {
// ...
}
import org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration
import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest
@DataLdapTest(excludeAutoConfiguration = [EmbeddedLdapAutoConfiguration::class])
class MyDataLdapTests {
// ...
}
附录中提供了启用的自动配置设置的列表。@DataLdapTest |
自动配置的 REST 客户端
您可以使用注释来测试 REST 客户端。
默认情况下,它会自动配置 Jackson、GSON 和 Jsonb 支持,配置 a 和 a ,并添加对 .
使用 Comments 时,不会扫描 Regular 和 bean。 可用于包含 bean。@RestClientTest
RestTemplateBuilder
RestClient.Builder
MockRestServiceServer
@Component
@ConfigurationProperties
@RestClientTest
@EnableConfigurationProperties
@ConfigurationProperties
附录中提供了启用的自动配置设置的列表。@RestClientTest |
要测试的特定 bean 应使用 的 or 属性指定。value
components
@RestClientTest
当在待测试的 bean 中使用 a 并在构建 时被调用时,则应从预期中省略根 URI,如以下示例所示:RestTemplateBuilder
RestTemplateBuilder.rootUri(String rootUri)
RestTemplate
MockRestServiceServer
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.client.RestClientTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.client.MockRestServiceServer;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
@RestClientTest(org.springframework.boot.docs.testing.springbootapplications.autoconfiguredrestclient.RemoteVehicleDetailsService.class)
class MyRestTemplateServiceTests {
@Autowired
private RemoteVehicleDetailsService service;
@Autowired
private MockRestServiceServer server;
@Test
void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
this.server.expect(requestTo("/greet/details")).andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
String greeting = this.service.callRestService();
assertThat(greeting).isEqualTo("hello");
}
}
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.autoconfigure.web.client.RestClientTest
import org.springframework.http.MediaType
import org.springframework.test.web.client.MockRestServiceServer
import org.springframework.test.web.client.match.MockRestRequestMatchers
import org.springframework.test.web.client.response.MockRestResponseCreators
@RestClientTest(RemoteVehicleDetailsService::class)
class MyRestTemplateServiceTests(
@Autowired val service: RemoteVehicleDetailsService,
@Autowired val server: MockRestServiceServer) {
@Test
fun getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
server.expect(MockRestRequestMatchers.requestTo("/greet/details"))
.andRespond(MockRestResponseCreators.withSuccess("hello", MediaType.TEXT_PLAIN))
val greeting = service.callRestService()
assertThat(greeting).isEqualTo("hello")
}
}
在待测试的bean中使用 a 时,或者在使用 a without calling 时,必须在预期中使用完整的 URI,如以下示例所示:RestClient.Builder
RestTemplateBuilder
rootUri(String rootURI)
MockRestServiceServer
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.client.RestClientTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.client.MockRestServiceServer;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
@RestClientTest(RemoteVehicleDetailsService.class)
class MyRestClientServiceTests {
@Autowired
private RemoteVehicleDetailsService service;
@Autowired
private MockRestServiceServer server;
@Test
void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
this.server.expect(requestTo("https://example.com/greet/details"))
.andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
String greeting = this.service.callRestService();
assertThat(greeting).isEqualTo("hello");
}
}
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.autoconfigure.web.client.RestClientTest
import org.springframework.http.MediaType
import org.springframework.test.web.client.MockRestServiceServer
import org.springframework.test.web.client.match.MockRestRequestMatchers
import org.springframework.test.web.client.response.MockRestResponseCreators
@RestClientTest(RemoteVehicleDetailsService::class)
class MyRestClientServiceTests(
@Autowired val service: RemoteVehicleDetailsService,
@Autowired val server: MockRestServiceServer) {
@Test
fun getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
server.expect(MockRestRequestMatchers.requestTo("https://example.com/greet/details"))
.andRespond(MockRestResponseCreators.withSuccess("hello", MediaType.TEXT_PLAIN))
val greeting = service.callRestService()
assertThat(greeting).isEqualTo("hello")
}
}
附录中提供了启用的自动配置设置的列表。@RestClientTest |
自动配置的 Spring REST Docs 测试
您可以使用注释在带有 Mock MVC、REST Assure 或 WebTestClient 的测试中使用 Spring REST Docs。
它消除了 Spring REST Docs 中对 JUnit 扩展的需求。@AutoConfigureRestDocs
@AutoConfigureRestDocs
可用于覆盖默认输出目录(如果您使用的是 Maven 或 Gradle)。
它还可用于配置出现在任何记录的 URI 中的主机、方案和端口。target/generated-snippets
build/generated-snippets
使用模拟 MVC 自动配置的 Spring REST 文档测试
@AutoConfigureRestDocs
自定义 Bean 以在测试基于 servlet 的 Web 应用程序时使用 Spring REST Docs。
你可以通过使用它来注入它,并在测试中使用它,就像你通常使用 Mock MVC 和 Spring REST Docs 时一样,如以下示例所示:MockMvc
@Autowired
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.assertj.MockMvcTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
@WebMvcTest(UserController.class)
@AutoConfigureRestDocs
class MyUserDocumentationTests {
@Autowired
private MockMvcTester mvc;
@Test
void listUsers() {
assertThat(this.mvc.get().uri("/users").accept(MediaType.TEXT_PLAIN)).hasStatusOk()
.apply(document("list-users"));
}
}
如果您更喜欢使用 AssertJ 集成,也可以使用,如以下示例所示:MockMvcTester
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.assertj.MockMvcTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
@WebMvcTest(UserController.class)
@AutoConfigureRestDocs
class MyUserDocumentationTests {
@Autowired
private MockMvcTester mvc;
@Test
void listUsers() {
assertThat(this.mvc.get().uri("/users").accept(MediaType.TEXT_PLAIN)).hasStatusOk()
.apply(document("list-users"));
}
}
两者都在后台重用同一个实例,因此对它的任何配置都适用于两者。MockMvc
如果您需要对 Spring REST Docs 配置的控制比 的属性提供更多的控制,则可以使用 bean,如以下示例所示:@AutoConfigureRestDocs
RestDocsMockMvcConfigurationCustomizer
-
Java
-
Kotlin
import org.springframework.boot.test.autoconfigure.restdocs.RestDocsMockMvcConfigurationCustomizer;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer;
import org.springframework.restdocs.templates.TemplateFormats;
@TestConfiguration(proxyBeanMethods = false)
public class MyRestDocsConfiguration implements RestDocsMockMvcConfigurationCustomizer {
@Override
public void customize(MockMvcRestDocumentationConfigurer configurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}
}
import org.springframework.boot.test.autoconfigure.restdocs.RestDocsMockMvcConfigurationCustomizer
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer
import org.springframework.restdocs.templates.TemplateFormats
@TestConfiguration(proxyBeanMethods = false)
class MyRestDocsConfiguration : RestDocsMockMvcConfigurationCustomizer {
override fun customize(configurer: MockMvcRestDocumentationConfigurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown())
}
}
如果你想利用 Spring REST Docs 对参数化输出目录的支持,你可以创建一个 bean。
使用此结果处理程序的 auto-configuration 调用,从而导致每个调用自动生成默认代码段。
以下示例显示了一个 being defined:RestDocumentationResultHandler
alwaysDo
MockMvc
RestDocumentationResultHandler
-
Java
-
Kotlin
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
@TestConfiguration(proxyBeanMethods = false)
public class MyResultHandlerConfiguration {
@Bean
public RestDocumentationResultHandler restDocumentation() {
return MockMvcRestDocumentation.document("{method-name}");
}
}
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler
@TestConfiguration(proxyBeanMethods = false)
class MyResultHandlerConfiguration {
@Bean
fun restDocumentation(): RestDocumentationResultHandler {
return MockMvcRestDocumentation.document("{method-name}")
}
}
使用 WebTestClient 自动配置的 Spring REST Docs 测试
@AutoConfigureRestDocs
也可以在测试反应式 Web 应用程序时使用。
你可以通过使用 using 来注入它,并在测试中使用它,就像你通常使用 Spring REST Docs 时一样,如以下示例所示:WebTestClient
@Autowired
@WebFluxTest
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.test.web.reactive.server.WebTestClient;
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;
@WebFluxTest
@AutoConfigureRestDocs
class MyUsersDocumentationTests {
@Autowired
private WebTestClient webTestClient;
@Test
void listUsers() {
this.webTestClient
.get().uri("/")
.exchange()
.expectStatus()
.isOk()
.expectBody()
.consumeWith(document("list-users"));
}
}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation
import org.springframework.test.web.reactive.server.WebTestClient
@WebFluxTest
@AutoConfigureRestDocs
class MyUsersDocumentationTests(@Autowired val webTestClient: WebTestClient) {
@Test
fun listUsers() {
webTestClient
.get().uri("/")
.exchange()
.expectStatus()
.isOk
.expectBody()
.consumeWith(WebTestClientRestDocumentation.document("list-users"))
}
}
如果您需要对 Spring REST Docs 配置的控制比 的属性提供更多的控制,则可以使用 bean,如以下示例所示:@AutoConfigureRestDocs
RestDocsWebTestClientConfigurationCustomizer
-
Java
-
Kotlin
import org.springframework.boot.test.autoconfigure.restdocs.RestDocsWebTestClientConfigurationCustomizer;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer;
@TestConfiguration(proxyBeanMethods = false)
public class MyRestDocsConfiguration implements RestDocsWebTestClientConfigurationCustomizer {
@Override
public void customize(WebTestClientRestDocumentationConfigurer configurer) {
configurer.snippets().withEncoding("UTF-8");
}
}
import org.springframework.boot.test.autoconfigure.restdocs.RestDocsWebTestClientConfigurationCustomizer
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer
@TestConfiguration(proxyBeanMethods = false)
class MyRestDocsConfiguration : RestDocsWebTestClientConfigurationCustomizer {
override fun customize(configurer: WebTestClientRestDocumentationConfigurer) {
configurer.snippets().withEncoding("UTF-8")
}
}
如果你想利用 Spring REST Docs 对参数化输出目录的支持,你可以使用 a 为每个实体交换结果配置一个使用者。
以下示例显示了这样一个被定义:WebTestClientBuilderCustomizer
WebTestClientBuilderCustomizer
-
Java
-
Kotlin
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.test.web.reactive.server.WebTestClientBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;
@TestConfiguration(proxyBeanMethods = false)
public class MyWebTestClientBuilderCustomizerConfiguration {
@Bean
public WebTestClientBuilderCustomizer restDocumentation() {
return (builder) -> builder.entityExchangeResultConsumer(document("{method-name}"));
}
}
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.boot.test.web.reactive.server.WebTestClientBuilderCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation
import org.springframework.test.web.reactive.server.WebTestClient
@TestConfiguration(proxyBeanMethods = false)
class MyWebTestClientBuilderCustomizerConfiguration {
@Bean
fun restDocumentation(): WebTestClientBuilderCustomizer {
return WebTestClientBuilderCustomizer { builder: WebTestClient.Builder ->
builder.entityExchangeResultConsumer(
WebTestClientRestDocumentation.document("{method-name}")
)
}
}
}
使用 REST Assured 自动配置的 Spring REST Docs 测试
@AutoConfigureRestDocs
使预配置为使用 Spring REST Docs 的 bean 可用于您的测试。
你可以通过使用它来注入它,并在测试中使用它,就像你通常使用 REST Assured 和 Spring REST Docs 时一样,如以下示例所示:RequestSpecification
@Autowired
-
Java
-
Kotlin
import io.restassured.specification.RequestSpecification;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.server.LocalServerPort;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.is;
import static org.springframework.restdocs.restassured.RestAssuredRestDocumentation.document;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestDocs
class MyUserDocumentationTests {
@Test
void listUsers(@Autowired RequestSpecification documentationSpec, @LocalServerPort int port) {
given(documentationSpec)
.filter(document("list-users"))
.when()
.port(port)
.get("/")
.then().assertThat()
.statusCode(is(200));
}
}
import io.restassured.RestAssured
import io.restassured.specification.RequestSpecification
import org.hamcrest.Matchers
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.boot.test.web.server.LocalServerPort
import org.springframework.restdocs.restassured.RestAssuredRestDocumentation
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestDocs
class MyUserDocumentationTests {
@Test
fun listUsers(@Autowired documentationSpec: RequestSpecification?, @LocalServerPort port: Int) {
RestAssured.given(documentationSpec)
.filter(RestAssuredRestDocumentation.document("list-users"))
.`when`()
.port(port)["/"]
.then().assertThat()
.statusCode(Matchers.`is`(200))
}
}
如果您需要对 Spring REST Docs 配置的控制比 的属性 提供更多的控制,则可以使用 bean,如以下示例所示:@AutoConfigureRestDocs
RestDocsRestAssuredConfigurationCustomizer
-
Java
-
Kotlin
import org.springframework.boot.test.autoconfigure.restdocs.RestDocsRestAssuredConfigurationCustomizer;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.restdocs.restassured.RestAssuredRestDocumentationConfigurer;
import org.springframework.restdocs.templates.TemplateFormats;
@TestConfiguration(proxyBeanMethods = false)
public class MyRestDocsConfiguration implements RestDocsRestAssuredConfigurationCustomizer {
@Override
public void customize(RestAssuredRestDocumentationConfigurer configurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}
}
import org.springframework.boot.test.autoconfigure.restdocs.RestDocsRestAssuredConfigurationCustomizer
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.restdocs.restassured.RestAssuredRestDocumentationConfigurer
import org.springframework.restdocs.templates.TemplateFormats
@TestConfiguration(proxyBeanMethods = false)
class MyRestDocsConfiguration : RestDocsRestAssuredConfigurationCustomizer {
override fun customize(configurer: RestAssuredRestDocumentationConfigurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown())
}
}
自动配置的 Spring Web 服务测试
自动配置的 Spring Web 服务客户端测试
可用于测试使用 Spring Web Services 项目调用 Web 服务的应用程序。
默认情况下,它会配置一个模拟 bean 并自动自定义您的 .
(有关将 Web 服务与 Spring Boot 结合使用的更多信息,请参阅 Web 服务。@WebServiceClientTest
WebServiceServer
WebServiceTemplateBuilder
附录中提供了启用的自动配置设置的列表。@WebServiceClientTest |
以下示例显示了正在使用的注释:@WebServiceClientTest
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.webservices.client.WebServiceClientTest;
import org.springframework.ws.test.client.MockWebServiceServer;
import org.springframework.xml.transform.StringSource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.ws.test.client.RequestMatchers.payload;
import static org.springframework.ws.test.client.ResponseCreators.withPayload;
@WebServiceClientTest(SomeWebService.class)
class MyWebServiceClientTests {
@Autowired
private MockWebServiceServer server;
@Autowired
private SomeWebService someWebService;
@Test
void mockServerCall() {
this.server
.expect(payload(new StringSource("<request/>")))
.andRespond(withPayload(new StringSource("<response><status>200</status></response>")));
assertThat(this.someWebService.test())
.extracting(Response::getStatus)
.isEqualTo(200);
}
}
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.autoconfigure.webservices.client.WebServiceClientTest
import org.springframework.ws.test.client.MockWebServiceServer
import org.springframework.ws.test.client.RequestMatchers
import org.springframework.ws.test.client.ResponseCreators
import org.springframework.xml.transform.StringSource
@WebServiceClientTest(SomeWebService::class)
class MyWebServiceClientTests(@Autowired val server: MockWebServiceServer, @Autowired val someWebService: SomeWebService) {
@Test
fun mockServerCall() {
server
.expect(RequestMatchers.payload(StringSource("<request/>")))
.andRespond(ResponseCreators.withPayload(StringSource("<response><status>200</status></response>")))
assertThat(this.someWebService.test()).extracting(Response::status).isEqualTo(200)
}
}
自动配置的 Spring Web 服务服务器测试
可用于测试使用 Spring Web Services 项目实现 Web 服务的应用程序。
默认情况下,它配置一个可用于调用 Web 服务端点的 Bean。
(有关将 Web 服务与 Spring Boot 结合使用的更多信息,请参阅 Web 服务。@WebServiceServerTest
MockWebServiceClient
附录中提供了启用的自动配置设置的列表。@WebServiceServerTest |
以下示例显示了正在使用的注释:@WebServiceServerTest
-
Java
-
Kotlin
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.webservices.server.WebServiceServerTest;
import org.springframework.ws.test.server.MockWebServiceClient;
import org.springframework.ws.test.server.RequestCreators;
import org.springframework.ws.test.server.ResponseMatchers;
import org.springframework.xml.transform.StringSource;
@WebServiceServerTest(ExampleEndpoint.class)
class MyWebServiceServerTests {
@Autowired
private MockWebServiceClient client;
@Test
void mockServerCall() {
this.client
.sendRequest(RequestCreators.withPayload(new StringSource("<ExampleRequest/>")))
.andExpect(ResponseMatchers.payload(new StringSource("<ExampleResponse>42</ExampleResponse>")));
}
}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.webservices.server.WebServiceServerTest
import org.springframework.ws.test.server.MockWebServiceClient
import org.springframework.ws.test.server.RequestCreators
import org.springframework.ws.test.server.ResponseMatchers
import org.springframework.xml.transform.StringSource
@WebServiceServerTest(ExampleEndpoint::class)
class MyWebServiceServerTests(@Autowired val client: MockWebServiceClient) {
@Test
fun mockServerCall() {
client
.sendRequest(RequestCreators.withPayload(StringSource("<ExampleRequest/>")))
.andExpect(ResponseMatchers.payload(StringSource("<ExampleResponse>42</ExampleResponse>")))
}
}
附录中提供了启用的自动配置设置的列表。@WebServiceClientTest |
附录中提供了启用的自动配置设置的列表。@WebServiceServerTest |
其他自动配置和切片
每个切片都提供一个或多个注释,即定义应作为切片的一部分包含的自动配置。
通过创建自定义注释或添加到测试,可以逐个测试添加其他自动配置,如以下示例所示:@AutoConfigure…
@AutoConfigure…
@ImportAutoConfiguration
-
Java
-
Kotlin
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration;
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
@JdbcTest
@ImportAutoConfiguration(IntegrationAutoConfiguration.class)
class MyJdbcTests {
}
import org.springframework.boot.autoconfigure.ImportAutoConfiguration
import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest
@JdbcTest
@ImportAutoConfiguration(IntegrationAutoConfiguration::class)
class MyJdbcTests
确保不要使用常规 Comments 来导入自动配置,因为它们是由 Spring Boot 以特定方式处理的。@Import |
或者,可以通过在存储的文件中注册切片注释来为切片注释的任何使用添加其他自动配置,如以下示例所示:META-INF/spring
com.example.IntegrationAutoConfiguration
在此示例中,在每个带有 .com.example.IntegrationAutoConfiguration
@JdbcTest
您可以在此文件中使用 Comments。# |
切片或批注可以通过这种方式进行自定义,只要它使用 .@AutoConfigure… @ImportAutoConfiguration |
确保不要使用常规 Comments 来导入自动配置,因为它们是由 Spring Boot 以特定方式处理的。@Import |
您可以在此文件中使用 Comments。# |
切片或批注可以通过这种方式进行自定义,只要它使用 .@AutoConfigure… @ImportAutoConfiguration |
用户配置和切片
如果您以合理的方式构建代码,则默认情况下会使用您的类作为测试的配置。@SpringBootApplication
因此,重要的是不要在应用程序的主类中混淆特定于其特定功能区域的配置设置。
假设您使用的是 Spring Data MongoDB,您依赖于它的自动配置,并且您已启用审计。
您可以按如下方式定义 your :@SpringBootApplication
-
Java
-
Kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.config.EnableMongoAuditing;
@SpringBootApplication
@EnableMongoAuditing
public class MyApplication {
// ...
}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.data.mongodb.config.EnableMongoAuditing
@SpringBootApplication
@EnableMongoAuditing
class MyApplication {
// ...
}
因为这个类是测试的源配置,所以任何切片测试实际上都会尝试启用 Mongo 审计,这绝对不是你想要的。
建议的方法是将特定于区域的配置移动到与应用程序位于同一级别的单独类,如以下示例所示:@Configuration
-
Java
-
Kotlin
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.EnableMongoAuditing;
@Configuration(proxyBeanMethods = false)
@EnableMongoAuditing
public class MyMongoConfiguration {
// ...
}
import org.springframework.context.annotation.Configuration
import org.springframework.data.mongodb.config.EnableMongoAuditing
@Configuration(proxyBeanMethods = false)
@EnableMongoAuditing
class MyMongoConfiguration {
// ...
}
根据应用程序的复杂程度,您可能有一个用于自定义的类,或者每个域区域有一个类。
后一种方法允许您在其中一个测试中启用它(如有必要),并使用 annotation。
有关何时可能需要为 slice 测试启用特定类的更多详细信息,请参阅此操作方法部分。@Configuration @Import @Configuration |
测试切片从扫描中排除类。
例如,对于 a ,以下配置将不会在测试切片加载的应用程序上下文中包含给定的 bean:@Configuration
@WebMvcTest
WebMvcConfigurer
-
Java
-
Kotlin
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration(proxyBeanMethods = false)
public class MyWebConfiguration {
@Bean
public WebMvcConfigurer testConfigurer() {
return new WebMvcConfigurer() {
// ...
};
}
}
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
@Configuration(proxyBeanMethods = false)
class MyWebConfiguration {
@Bean
fun testConfigurer(): WebMvcConfigurer {
return object : WebMvcConfigurer {
// ...
}
}
}
但是,下面的配置将导致测试切片加载自定义。WebMvcConfigurer
-
Java
-
Kotlin
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Component
public class MyWebMvcConfigurer implements WebMvcConfigurer {
// ...
}
import org.springframework.stereotype.Component
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
@Component
class MyWebMvcConfigurer : WebMvcConfigurer {
// ...
}
另一个混淆的来源是 Classpath scanning。 假设您以合理的方式构建了代码,但需要扫描其他包。 您的应用程序可能类似于以下代码:
-
Java
-
Kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan({ "com.example.app", "com.example.another" })
public class MyApplication {
// ...
}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.ComponentScan
@SpringBootApplication
@ComponentScan("com.example.app", "com.example.another")
class MyApplication {
// ...
}
这样做可以有效地覆盖默认的组件 scan 指令,其副作用是扫描这两个包,而不管你选择了哪个 slice。
例如,a 似乎突然扫描了应用程序的组件和用户配置。
同样,将 custom 指令移动到单独的类是解决此问题的好方法。@DataJpaTest
如果这不是您的选项,则可以在测试的层次结构中创建一个 somewhere ,以便改用它。
或者,您可以为测试指定一个源,这将禁用查找默认源的行为。@SpringBootConfiguration |
根据应用程序的复杂程度,您可能有一个用于自定义的类,或者每个域区域有一个类。
后一种方法允许您在其中一个测试中启用它(如有必要),并使用 annotation。
有关何时可能需要为 slice 测试启用特定类的更多详细信息,请参阅此操作方法部分。@Configuration @Import @Configuration |
如果这不是您的选项,则可以在测试的层次结构中创建一个 somewhere ,以便改用它。
或者,您可以为测试指定一个源,这将禁用查找默认源的行为。@SpringBootConfiguration |
使用 Spock 测试 Spring Boot 应用程序
Spock 2.2 或更高版本可用于测试 Spring Boot 应用程序。
为此,请将对 Spock 模块版本的依赖项添加到应用程序的构建中。 将 Spring 的测试框架集成到 Spock 中。
有关更多详细信息,请参阅 Spock 的 Spring 模块的文档。-groovy-4.0
spock-spring
spock-spring