网站首页 > 技术文章 正文
下一篇[46.3.16、自动配置的 Data MongoDB 测试]
英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html
GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot
46.3.11、自动配置的 Spring WebFlux 测试
要测试 Spring WebFlux 控制器是否按预期工作,可以使用 @WebFluxTest 注解。@WebFluxTest 自动配置 Spring WebFlux 基础设施,并将扫描的 bean 限制为 @Controller 、 @ControllerAdvice 、 @JsonComponent 、 Converter 、 GenericConverter 和 WebFluxConfigurer。当使用 @WebFluxTest 注解时,不会扫描常规 @Component bean。
提示:可以在附录中找到由 @WebFluxTest 启用的自动配置的列表。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/test-auto-configuration.html )
提示:如果你需要注册额外的组件,比如 Jackson Module,你可以在测试中使用 @Import 来导入额外的配置类。
通常,@WebFluxTest 仅限于单个控制器,并与 @MockBean 结合使用,为所需的协作者提供模拟实现。
@WebFluxTest 也会自动配置 WebTestClient。它提供了一种强大的方法来快速测试 WebFlux 控制器,而不需要启动完整的 HTTP 服务器。
提示:你还可以在非 @WebFluxTest(如 @SpringBootTest)中自动配置 WebTestClient,方法是使用 @AutoConfigureWebTestClient 对其进行注解。以下示例展示一个同时使用 @WebFluxTest 和 WebTestClient 的类:
import org.junit.Test;
import org.junit.runner.RunWith;
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.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;
@RunWith(SpringRunner.class)
@WebFluxTest(UserVehicleController.class)
public class MyControllerTests {
@Autowired
private WebTestClient webClient;
@MockBean
private UserVehicleService userVehicleService;
@Test
public void testExample() throws Exception {
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");
}
}
提示:此设置仅被 WebFlux 应用程序支持,因为在模拟的 web 应用程序中使用 WebTestClient 目前仅适用于 WebFlux。
注释:@WebFluxTest 无法检测通过功能性 web 框架注册的路由。为了在上下文中测试 RouterFunction bean,请考虑通过 @Import 或使用 @SpringBootTest 自己导入 RouterFunction。
注释:@WebFluxTest 无法检测通过 SecurityWebFilterChain 类型的 @Bean 注册的自定义安全配置。要在测试中包含它,你需要通过 @Import 或使用 @SpringBootTest 导入注册 bean 的配置。
提示:有时编写 Spring WebFlux 测试是不够的;Spring Boot 可以帮助你在实际的服务器上运行完整的端到端测试。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-with-running-server )
46.3.12、自动配置的 Data JPA 测试
你可以使用 @DataJpaTest 注解来测试 JPA 应用程序。默认情况下,它扫描 @Entity 类并配置 Spring Data JPA 存储库。如果类路径上有可用的嵌入式数据库,它也会配置一个。常规 @Component bean 未加载到 ApplicationContext 中。
提示:可以在附录中找到由 @DataJpaTest 启用的自动配置的列表。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/test-auto-configuration.html )
默认情况下,Data JPA 测试是事务性的,并在每个测试结束时回滚。有关更多详细信息,请参见 Spring Framework 参考文档中的相关部分。如果这不是你想要的,你可以为一个测试或整个类禁用事务管理,如下所示:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringRunner.class)
@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class ExampleNonTransactionalTests {
}
Data JPA 测试也可以注入 TestEntityManager bean,它提供了一个替代专门为测试设计的标准 JPA EntityManager 的方法。如果要在 @DataJpaTest 实例之外使用 TestEntityManager,也可以使用 @AutoConfigureTestEntityManager 注解。如果需要,也可以使用 JdbcTemplate。以下示例显示了正在使用的 @DataJpaTest 注解:
import org.junit.*;
import org.junit.runner.*;
import org.springframework.boot.test.autoconfigure.orm.jpa.*;
import static org.assertj.core.api.Assertions.*;
@RunWith(SpringRunner.class)
@DataJpaTest
public class ExampleRepositoryTests {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository repository;
@Test
public void testExample() throws Exception {
this.entityManager.persist(new User("sboot", "1234"));
User user = this.repository.findByUsername("sboot");
assertThat(user.getUsername()).isEqualTo("sboot");
assertThat(user.getVin()).isEqualTo("1234");
}
}
内存中的嵌入式数据库通常可以很好地用于测试,因为它们速度快,不需要任何安装。但是,如果希望对真实数据库运行测试,则可以使用 @AutoConfigureTestDatabase 注解,如下面示例所示:
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class ExampleRepositoryTests {
// ...
}
46.3.13、自动配置的 JDBC 测试
@JdbcTest 类似于 @DataJpaTest,但只用于只需要 DataSource 而不使用 Spring Data JDBC 的测试。默认情况下,它配置内存中的嵌入式数据库和 JdbcTemplate。常规 @Component bean 未加载到 ApplicationContext 中。
提示:可以在附录中找到由 @JdbcTest 启用的自动配置的列表。
默认情况下,JDBC 测试是事务性的,并在每个测试结束时回滚。有关更多详细信息,请参见 Spring Framework 参考文档中的相关部分。如果这不是你想要的,你可以为一个测试或整个类禁用事务管理,如下所示:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringRunner.class)
@JdbcTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class ExampleNonTransactionalTests {
}
如果希望你的测试在真实的数据库上运行,你可以使用 @AutoConfigureTestDatabase 注解,其方式与 DataJpaTest 相同。(请参见第 46.3.12 节:自动配置的 Data JPA 测试)(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-jpa-test )
46.3.14、自动配置的 Data JDBC 测试
@DataJdbcTest 类似于 @JdbcTest,但用于使用 Spring Data JDBC 存储库的测试。默认情况下,它配置内存中的嵌入式数据库、JdbcTemplate 和 Spring Data JDBC 存储库。常规 @Component bean 未加载到 ApplicationContext 中。
提示:可以在附录中找到由 @DataJdbcTest 启用的自动配置的列表。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/test-auto-configuration.html )
默认情况下,Data JDBC 测试是事务性的,并在每个测试结束时回滚。有关更多详细信息,请参见 Spring Framework 参考文档中的相关部分。如果这不是你想要的,你可以为一个测试或整个测试类禁用事务管理,如 JDBC 示例所示。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-jdbc-test )
如果希望你的测试在真实的数据库上运行,你可以使用 @AutoConfigureTestDatabase 注解,其方式与 DataJpaTest 相同。(请参见第 46.3.12节:自动配置的 Data JPA 测试)(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-jpa-test )
46.3.15、自动配置的 jOOQ 测试
你可以以与 @JdbcTest 类似的方式使用 @JooqTest,但用于 jOOQ 相关的测试。由于 jOOQ 严重依赖与数据库模式相对应的基于 Java 的模式,因此使用了现有的数据源。如果要将其替换为内存数据库,可以使用 @AutoConfigureTestDatabase 覆盖这些设置。(有关在 Spring Boot 中使用 jOOQ 的更多信息,请参阅本章之前的第 31.6 节:使用 jOOQ。)常规 @Component bean 未加载到 ApplicationContext 中。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-sql.html#boot-features-jooq )
提示:可以在附录中找到由 @JooqTest 启用的自动配置的列表。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/test-auto-configuration.html )
@JooqTest 配置 DSLContext。常规 @Component bean 未加载到 ApplicationContext 中。以下示例显示了正在使用的 @JooqTest 注解:
import org.jooq.DSLContext;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.jooq.JooqTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@JooqTest
public class ExampleJooqTests {
@Autowired
private DSLContext dslContext;
}
默认情况下,JOOQ 测试是事务性的,并在每个测试结束时回滚。如果这不是你想要的,你可以为一个测试或整个测试类禁用事务管理,如 JDBC 示例所示。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-jdbc-test )
猜你喜欢
- 2024-10-17 使用 Spock 编写高效简洁的单元测试
- 2024-10-17 程序员有福了!万字长文带你掌握SpringBoot所提供的测试解决方案
- 2024-10-17 如何使用Spring Boot提供的测试工具和注解。
- 2024-10-17 单元测试实践(Spring-boot+Junbit5+Mockito)
- 2024-10-17 Spring云原生实战指南:8 弹性和可扩展性
- 2024-10-17 SpringBoot 太强了,这些优势你需要了解
- 2024-10-17 如何使用Spring Cloud Contract(如何使用朋友的山姆卡)
- 2024-10-17 Spring Boot 开发离不开这些注解,快来学习啦!
- 2024-10-17 一台不容错过的Java单元测试代码“永动机”
- 2024-10-17 Spring Boot 中如何完成单元测试?
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)