微服务架构之Spring Boot(六十五)

2022-05-23 15:41:40 浏览数 (1)

45.3.11自动配置Spring WebFlux测试

要测试Spring WebFlux控制器是否按预期工作,您可以使用 @WebFluxTest 注释。@WebFluxTest 自动配置Spring WebFlux基础架构,并将扫

描的beans限制为 @Controller , @ControllerAdvice , @JsonComponent , Converter , GenericConverter 和 WebFluxConfigurer 。

使用 @WebFluxTest 注释时,不会扫描常规 @Component beans。

可以在附录中找到 @WebFluxTest 启用的自动配置列表 。

如果需要注册额外的组件,例如Jackson Module ,则可以在测试中使用 @Import 导入其他配置类。

通常, @WebFluxTest 仅限于单个控制器,并与 @MockBean 注释结合使用,为所需的协作者提供模拟实现。

@WebFluxTest 也是自动配置 WebTestClient ,它提供了一种快速测试WebFlux控制器的强大方法,无需启动完整的HTTP服务器。

您还可以通过使用 @AutoConfigureWebTestClient 对其进行注释,在非 @WebFluxTest (例如 @SpringBootTest )中自动配

置 WebTestClient 。以下示例显示了同时使用 @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 beans,请考虑通过 @Import 或使

用 @SpringBootTest 自行导入 RouterFunction 。

有时写Spring WebFlux测试是不够的; Spring Boot可以帮助您使用实际服务器运行 完整的端到端测试。

45.3.12自动配置的数据JPA测试

您可以使用 @DataJpaTest 注释来测试JPA应用程序。默认情况下,它配置内存中的嵌入式数据库,扫描 @Entity 类,并配置Spring Data JPA

存储库。常规 @Component beans未加载到 ApplicationContext 。

可以在附录中找到 @DataJpaTest 启用的自动配置设置列表 。

默认情况下,数据JPA测试是事务性的,并在每次测试结束时回滚。有关 更多详细信息,请参阅Spring框架参考文档中的相关部分。如果这不是

您想要的,您可以为测试或整个类禁用事务管理,如下所示:

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 {

}

数据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 {

// ...

}

45.3.13自动配置的JDBC测试

@JdbcTest 类似于 @DataJpaTest ,但适用于仅需要 DataSource 并且不使用Spring数据JDBC的测试。默认情况下,它配置内存中嵌入式数据

库和 JdbcTemplate 。常规 @Component beans未加载到 ApplicationContext 。

可以在附录中找到 @JdbcTest 启用的自动配置列表 。

默认情况下,JDBC测试是事务性的,并在每次测试结束时回滚。有关更多详细信息,请参阅Spring框架参考文档中的 相关部分。如果这不是您

想要的,您可以禁用测试或整个类的事务管理,如下所示:

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 相同。(参见“ 第45.3.12节 ”

,“自动配置的数据JPA测试” “。)

45.3.14自动配置的数据JDBC测试

@DataJdbcTest 类似于 @JdbcTest ,但适用于使用Spring数据JDBC存储库的测试。默认情况下,它配置内存中的嵌入式数据

库, JdbcTemplate 和Spring数据JDBC存储库。常规 @Component beans未加载到 ApplicationContext 。

可以在附录中找到 @DataJdbcTest 启用的自动配置列表 。

默认情况下,数据JDBC测试是事务性的,并在每次测试结束时回滚。有关 更多详细信息,请参阅Spring框架参考文档中的相关部分。如果这不

是您想要的,您可以禁用测试或整个测试类的事务管理,如 JDBC示例中所示。

如果您希望测试针对真实数据库运行,则可以使用 @AutoConfigureTestDatabase 注释,方法与 DataJpaTest 相同。(参见“ 第45.3.12节 ”

,“自动配置的数据JPA测试” “。)

45.3.15自动配置的jOOQ测试

您可以使用与 @JdbcTest 类似的方式使用 @JooqTest ,但是可以使用与jOOQ相关的测试。由于jOOQ严重依赖于与数据库模式相对应的基于

Java的模式,因此使用现有的 DataSource 。如果要将其替换为内存数据库,可以使用 @AutoConfigureTestDatabase 覆盖这些设置。(有关

在Spring Boot中使用jOOQ的更多信息,请参阅本章前面的“ 第30.6节 ” ,“使用jOOQ”。)常规 @Component beans未加载

到 ApplicationContext 。

可以在附录中找到 @JooqTest 启用的自动配置列表 。

@JooqTest 配置 DSLContext 。常规 @Component beans未加载到 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示例中

所示。

0 人点赞