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示例中
所示。