优秀的编程知识分享平台

网站首页 > 技术文章 正文

Spring Boot中文参考指南46.3.11、自动配置的Spring WebFlux测试

nanyue 2024-10-17 11:15:48 技术文章 12 ℃

上一篇[46.3.6、使用 JMX]

下一篇[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 )

上一篇[46.3.6、使用 JMX]

下一篇[46.3.16、自动配置的 Data MongoDB 测试]

Tags:

最近发表
标签列表