Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

<code>英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html/<code>
<code>GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot/<code>

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 的類:

Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

<code>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");
}

}/<code>

提示:此設置僅被 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 參考文檔中的相關部分。如果這不是你想要的,你可以為一個測試或整個類禁用事務管理,如下所示:

Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

<code>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 {

}/<code>

Data JPA 測試也可以注入 TestEntityManager bean,它提供了一個替代專門為測試設計的標準 JPA EntityManager 的方法。如果要在 @DataJpaTest 實例之外使用 TestEntityManager,也可以使用 @AutoConfigureTestEntityManager 註解。如果需要,也可以使用 JdbcTemplate。以下示例顯示了正在使用的 @DataJpaTest 註解:

Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

<code>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");
}

}/<code>

內存中的嵌入式數據庫通常可以很好地用於測試,因為它們速度快,不需要任何安裝。但是,如果希望對真實數據庫運行測試,則可以使用 @AutoConfigureTestDatabase 註解,如下面示例所示:

Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

<code>@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class ExampleRepositoryTests {

// ...

}/<code>

46.3.13、自動配置的 JDBC 測試

@JdbcTest 類似於 @DataJpaTest,但只用於只需要 DataSource 而不使用 Spring Data JDBC 的測試。默認情況下,它配置內存中的嵌入式數據庫和 JdbcTemplate。常規 @Component bean 未加載到 ApplicationContext 中。

提示:可以在附錄中找到由 @JdbcTest 啟用的自動配置的列表。

默認情況下,JDBC 測試是事務性的,並在每個測試結束時回滾。有關更多詳細信息,請參見 Spring Framework 參考文檔中的相關部分。如果這不是你想要的,你可以為一個測試或整個類禁用事務管理,如下所示:

Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

<code>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 {

}/<code>

如果希望你的測試在真實的數據庫上運行,你可以使用 @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 註解:

Spring Boot中文參考指南46.3.11、自動配置的Spring WebFlux測試

<code>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;
}/<code>

默認情況下,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 )


分享到:


相關文章: