<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 在 Spring Boot 2 中進行測試 > 原文: [https://howtodoinjava.com/spring-boot2/testing/testing-support/](https://howtodoinjava.com/spring-boot2/testing/testing-support/) 學習在 Spring Boot 應用程序中編寫單元測試和集成測試。 了解單元測試和集成測試之間的區別,以及支持此類測試的注解。 ## 1\. 單元測試與集成測試 通常,任何軟件應用程序都分為不同的模塊和組件。 孤立地測試一個這樣的組件時,稱為單元測試。 編寫該代碼是為了驗證一小段代碼是否正在執行預期的操作。 **單元測試**無法驗證應用程序代碼是否與外部依賴項正確配合。 它專注于單個組件并模擬與該組件交互的所有依賴項。 一旦開發并集成了不同的模塊,便會執行集成測試。 其主要目的是發現不同模塊相互交互以端對端處理用戶請求時的問題。 **集成測試**可以根據要測試的內容,將整個應用程序置于范圍內或僅包含某些組件。 他們可能需要為數據庫實例和硬件分配資源。 盡管也可以模擬這些交互以提高測試性能。 就典型的[ Spring boot crud 應用程序](https://howtodoinjava.com/spring-boot2/spring-boot-crud-hibernate/)而言,可以編寫單元測試來分別測試 REST 控制器,DAO 層等。 甚至不需要[嵌入式服務器](https://howtodoinjava.com/spring-boot2/embedded-tomcat-configuration/)。 在集成測試中,我們將專注于測試從控制器到持久層的完整請求處理。 應用程序應在嵌入式服務器中運行,以創建應用程序上下文和所有 bean。 這些 bean 中的某些可能會被覆蓋以模擬某些行為。 ## 2\. 依賴項 #### 2.1. Junit 4 測試(默認) 要在 Spring Boot 應用程序中編寫測試,最好的方法是在`pom.xml`文件中包含`spring-boot-starter-test`。 它將 [Junit 4](https://howtodoinjava.com/junit-4/),AssertJ,Hamcrest,[Mockito](https://howtodoinjava.com/mockito/junit-mockito-example/),JSONassert 和 JsonPath 依賴項帶入具有測試范圍的應用程序中。 `pom.xml` ```java <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` #### 2.2. Junit 5 測試 Spring Boot 也支持 [Junit 5](https://howtodoinjava.com/spring-5-tutorial/) 測試。 要使用 Junit 5,請包含它的依賴項,并從`spring-boot-starter-test`中排除 Junit 4。 編寫集成測試時,嵌入式數據庫依賴關系非常方便。 `pom.xml` ```java dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <!-- exclude junit 4 --> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency> <!-- junit 5 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> <version>1.4.194</version> </dependency> ``` ## 3\. 運行器 用 Spring Boot 編寫的測試可以多種方式運行。 讓我們來看看幾種最常見的方式。 #### 3.1. `@RunWith(SpringRunner.class)` – [Junit 4] 默認情況下,編寫的測試在 Junit 4 中進行。要運行此類測試,我們可以在類級別使用`@RunWith`注解使用[`SpringRunner`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/context/junit4/SpringRunner.html)類(擴展`SpringJUnit4ClassRunner`)。 `SpringRunner example` ```java @RunWith(SpringRunner.class) @WebFluxTest(controllers = EmployeeController.class) public class EmployeeRestControllerTest { //tests } ``` #### 3.2. `@RunWith(MockitoJUnitRunner.class)` – [Junit 4 with Mockito] 它測試使用`@Mock`對象,首選使用[`MockitoJUnitRunner`](https://static.javadoc.io/org.mockito/mockito-core/2.6.8/org/mockito/junit/MockitoJUnitRunner.html)對象。 它初始化帶有 Mock 注解的模擬,因此不需要顯式使用`MockitoAnnotations.initMocks(Object)`。在每種測試方法之前都要初始化模擬。 `MockitoJUnitRunner example` ```java @RunWith(MockitoJUnitRunner.class) public class EmployeeRestControllerTest { @Mock private Repository repository; } ``` #### 3.3. `@ExtendWith(SpringExtension.class)` – [Junit 5] [`SpringExtension`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/junit/jupiter/SpringExtension.html)將 Spring TestContext Framework 集成到 JUnit 5 的 Jupiter 編程模型中。 `SpringExtension example` ```java //@ExtendWith(SpringExtension.class) // included in @WebFluxTest @WebFluxTest(controllers = EmployeeController.class) @Import(EmployeeService.class) public class EmployeeControllerTest { // } ``` #### 3.4. `@ExtendWith(MockitoExtension.class)` – [Junit 5] [`MockitoExtension`](https://static.javadoc.io/org.mockito/mockito-junit-jupiter/3.0.0/org/mockito/junit/jupiter/MockitoExtension.html)初始化模擬并處理嚴格的存根。它等效于`MockitoJUnitRunner`。 大多數測試注解都包含此注解,因此無需明確包含它。 `MockitoExtension example` ```java @ExtendWith(MockitoExtension.class) public class EmployeeControllerTest { // } ``` ## 4\. Spring Boot `*Test`注解 Spring Boot 提供了各種注解,以啟用僅與應用程序的某些部分相關的測試基礎結構。 它還提供了注解,這些注解也有助于集成測試。 讓我們拜訪他們。 #### 4.1. `@SpringBootTest` 該注解有助于編寫**集成測試**。 它啟動嵌入式服務器并完全初始化應用程序上下文。 我們可以使用`@Autowired`注解將依賴項注入測試類中。 我們還可以使用[嵌套`@Configuration`類](https://howtodoinjava.com/spring-boot2/springboot-test-configuration/)或顯式`@TestConfiguration`類提供特定于測試的 bean 配置。 它還為不同的`webEnvironment`模式提供支持,并在定義的或隨機的端口上監聽正在運行的 Web 服務器。 它還注冊了[`TestRestTemplate`](https://howtodoinjava.com/spring-boot2/testresttemplate-post-example/)和/或`WebTestClient` bean,用于 Web 測試。 `@SpringBootTest example` ```java @SpringBootTest(classes = SpringBootDemoApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class EmployeeControllerIntegrationTests { @LocalServerPort private int port; @Autowired private TestRestTemplate restTemplate; //tests } ``` > 閱讀更多:[`@SpringBootTest`示例](https://howtodoinjava.com/spring-boot2/springboottest-annotation/) #### 4.2. `@WebMvcTest` 此注解用于 [Spring MVC](https://howtodoinjava.com/spring-mvc-tutorial/) 測試。 它禁用完整的[自動配置](https://howtodoinjava.com/spring-boot/springbootapplication-auto-configuration/),而僅應用與 MVC 測試相關的配置。 它還會自動配置`MockMvc`實例。 通過將`.class`作為注解屬性,我們只能初始化一個 Web 控制器。 `@WebMvcTest example` ```java @WebMvcTest(EmployeeRESTController.class) public class TestEmployeeRESTController { @Autowired private MockMvc mvc; // } ``` > 閱讀更多:[`@WebMvcTest`示例](https://howtodoinjava.com/spring-boot2/spring-boot-mockmvc-example/) #### 4.3. `@WebFluxTest` 該注解禁用了完全自動配置,而是僅應用與 [WebFlux](https://howtodoinjava.com/spring-webflux/spring-webflux-tutorial/) 測試相關的配置。 默認情況下,用`@WebFluxTest`注解的測試也將自動配置`WebTestClient`。 通常,`@WebFluxTest`與[`@MockBean`](https://howtodoinjava.com/spring-boot2/spring-mockbean-annotation/)或`@Import`結合使用以創建控制器 bean 所需的任何協作者。 `@WebMvcTest example` ```java @WebFluxTest(controllers = EmployeeController.class) @Import(EmployeeService.class) public class EmployeeControllerTest { @MockBean EmployeeRepository repository; @Autowired private WebTestClient webClient; //tests } ``` > 閱讀更多:[`@WebFluxTest`示例](https://howtodoinjava.com/spring-webflux/webfluxtest-with-webtestclient/) #### 4.4. 其他常用注解 * `@JdbcTest` – 當測試僅針對基于 jdbc 的組件時,可以用于典型的 [jdbc](https://howtodoinjava.com/jdbc-tutorials/) 測試。它禁用完全自動配置,而是僅應用與 jdbc 測試相關的配置。 默認情況下,用`@JdbcTest`注解的測試是事務性的,并在每個測試結束時回滾。 注解配置內存中嵌入式數據庫和`JdbcTemplate`。 * `@JooqTest` – 當測試僅關注基于 jOOQ 的組件時,可以使用它。 注意,默認情況下,帶有`@JooqTest`注解的測試使用應用程序配置的數據庫。 要使用嵌入式內存數據庫,可以使用 `@AutoConfigureTestDatabase`注解來覆蓋這些設置。 * `@JsonTest` – 當測試僅關注 JSON 序列化時使用。 它初始化`@JsonComponent`,`JacksonTester`,`JsonbTester`和`GsonTester`字段。 * [`@DataJpaTest`](https://howtodoinjava.com/spring-boot2/testing/datajpatest-annotation/) – 它可以用來測試 JPA 應用程序。 默認情況下,它將掃描`@Entity`類并配置 Spring Data JPA 存儲庫。 如果在類路徑上有嵌入式數據庫,它也將配置一個。 默認情況下,數據 JPA 測試是事務性的,并在每次測試結束時回滾。 數據 JPA 測試也可以注入`TestEntityManager` bean,它為專門設計用于測試的標準 JPA `EntityManager`提供了替代方法。 * `@DataMongoTest` – 用于測試 MongoDB 應用程序。 默認情況下,它配置內存嵌入式 MongoDB(如果可用),配置`MongoTemplate`,掃描`@Document`類,并配置 Spring Data MongoDB 存儲庫。 * `@DataRedisTest` – 用于測試 Redis 應用程序。 默認情況下,它會掃描`@RedisHash`類并配置 Spring Data Redis 存儲庫。 * `@DataLdapTest` – 用于測試 LDAP 應用程序。 默認情況下,它配置內存嵌入式 LDAP(如果可用),配置`LdapTemplate`,掃描`@Entry`類,并配置 Spring Data LDAP 存儲庫。 * [`@RestClientTest`](https://howtodoinjava.com/spring-boot2/testing/restclienttest-test-services/) – 用于測試 REST 客戶端。 默認情況下,它會自動配置 Jackson,GSON 和 Jsonb 支持,配置`RestTemplateBuilder`,并添加對`MockRestServiceServer`的支持。 ## 5\. 測試配置 `@TestConfiguration`是`@Configuration`的特殊形式,可用于定義其他 bean 或測試的自定義項。 在 SpringBoot 中,任何在頂級類中配置并帶有`@TestConfiguration`注解的 Bean 將不會通過組件掃描獲得。 我們必須使用包含測試用例的類顯式注冊`@TestConfiguration`類。 最好的是,這些測試配置不會自動成為應用程序主要配置的一部分。 僅可通過以下兩種方式之一按需使用它們以包括此附加測試配置,即 #### 5.1. `@Import`注解 它稱為將一個或多個配置類導入應用程序上下文或 Spring 測試上下文中。 `Import test config` ```java @Import(MyTestConfiguration.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class SpringBootDemoApplicationTests { @LocalServerPort int randomServerPort; @Autowired DataSource datasource; //tests } ``` #### 5.2. 靜態嵌套類 我們可以在測試類內部的嵌套類中定義測試配置。 嵌套類可以使用`@Configuration`或`@TestConfiguration`注解進行注解。 * 對于嵌套的`@Configuration`類,將使用給定的配置“代替”應用程序的主要配置。 * 嵌套`@TestConfiguration`類用于“附加”應用程序的主要配置。 `Import test config` ```java @Import(MyTestConfiguration.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class SpringBootDemoApplicationTests { @LocalServerPort int randomServerPort; @Autowired DataSource datasource; //tests } ``` ## 6\. 模擬 對于使用或不使用 Mockito 的依賴關系,Spring Boot 都提供了出色的支持。 #### 6.1. 帶有 Mockito – `@Mock` `@Mock`用于模擬創建。 它使測試類更具可讀性。 在測試類中,要處理模擬注解,必須至少使用一次`MockitoAnnotations.initMocks(testClass)`。 請注意,如果您正在使用`RunWith(MockitoJUnitRunner.class)`,則無需顯式使用`MockitoAnnotations.initMocks()`。 在每種測試方法之前都要初始化模擬。 在不需要 Spring 文本上下文的單元測試中使用`@Mock`。 #### 6.2. 沒有 Mockito – `@MockBean` `@MockBean`注解用于將模擬添加到 Spring `ApplicationContext`。它允許模擬類或接口,并記錄和驗證其行為。 有趣的是,上下文中定義的任何相同類型的現有 bean 都將被該模擬代替。 如果沒有定義現有的 bean,將添加一個新的 bean。 `@MockBean`與 Mockito 的`@Mock`類似,但具有 Spring 支持。 我們通常將`@MockBean`與`@WebMvcTest`或`@WebFluxTest`注解一起使用。 這些注解適用于 Web 測試片,并且僅限于單個控制器。 在給定的示例中,我們在模擬`EmployeeRepository` bean。 這樣,將調用所有應用程序代碼,但將模擬所有存儲庫交互。 ```java @WebFluxTest(controllers = EmployeeController.class) @Import(EmployeeService.class) public class EmployeeControllerTest { @MockBean EmployeeRepository repository; @Autowired private WebTestClient webClient; //tests } ``` ## 7\. 結論 Spring Boot 為應用程序及其各種模塊的[單元測試](https://howtodoinjava.com/spring-boot2/rest-controller-unit-test-example/)和[集成測試](https://howtodoinjava.com/spring-boot2/spring-integration-testing/)提供了出色的支持。 我們將非常小心地通過使用注解來使用所提供的支持。 使用`@SpringBootTest`注解進行集成測試,而其他自動配置注解則用于特定組件的單元測試。 模擬特定行為是非常普遍的要求,為此,我們可以使用嘲笑者的`@Mock`或 Spring 的x`@MockBean`注解。 將我的問題放在評論部分。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看