簡體   English   中英

在單體 SpringBoot 應用程序中創建集成測試

[英]Creating integration tests in a monolithic SpringBoot application

我被要求為一個非常大的 SpringBoot 項目中的服務創建一個集成測試,該項目產生了數十個已實現的服務。 當應用程序執行時,所有這些服務都會被部署——我想避免部署與我為其創建測試的服務無關的所有服務。 不幸的是,我(還)沒有我希望的那樣豐富的 spring 啟動測試經驗,因此我想知道解決這個問題的最佳方法是什么。

我正在考慮在測試 class 中使用@MockBean注釋注釋所有不相關的服務,並使用@Autowire注釋所有相關服務,但我不確定這是否是 go 的正確方法。任何人都可以指出我正確的方向嗎?

謝謝。

答案很大程度上取決於集成測試的范圍。 我將嘗試涵蓋兩種主要方式,您可以在 google 上搜索更多示例和詳細信息。 Spring Boot 測試文檔也是您的朋友。

切片

Spring Boot 提供了稱為slices 的測試實用程序。 例如,有一個用於測試您的控制器的切片 - @WebMvcTest - 此測試將加載用於從 HTTP 和您指定的控制器( @WebMvcTest(YourController.class) )調用您的應用程序的所有配置。 之后,您需要決定如何處理該控制器的依賴項。

你可以:

  • @MockBean模擬它們。
  • 使用@Import提供真正的實現(或附加配置)(然后您必須再次處理新導入的依賴項的依賴項)。
  • 加載 Spring Boot 自動配置的附加部分。 這可以使用@AutoConfigureSomething注釋來完成。 - 所有切片基本上都是自動配置注釋的組合,您可以自由地將它們添加到您的測試中。 例如,查看DataJpaTest上的注釋,了解添加使用測試數據庫設置 Spring Boot Data JPA 所需的功能。

每個測試最多可以有一個切片,但您可以導入任意數量的附加服務、配置、模擬、自動配置等。重點是 - 您選擇為測試配置的內容; 具有新依賴項的新無關服務不應破壞現有測試。

啟動測試

另一種方法是@SpringBootTest注釋 - 這在相反的方向 - 默認情況下它加載所有內容,您可以使用@MockBean@EnableAutoConfiguration(exclude=SomeClass)等排除您不想要的@MockBean

在添加新服務時,當然存在破壞現有測試的危險。 - 這不應該經常發生,因為一切都是自動配置的,但它仍然是一種可能性,尤其是在具有更多配置的單體中。

如果您必須創建 spring 集成測試,您必須: - 通過在測試類上使用注釋來調用 spring 上下文 - 例如:@RunWith(SpringJUnit4ClassRunner.class) - 在您不打算測試的服務上使用 @MockBean 或 @SpyBean 注釋但它們是測試方法/類的一部分 - 在您要測試的類上使用 @Autowired 注釋。 要驗證結果,您可以使用 Junit4 或 Junit5 斷言,驗證行為您可以使用 Mockito

我有一個類似的問題,希望能夠在 Springboot 中隔離特定組件(或服務)的集成測試; 我的約束是我必須使用 JUnit5 和 Mockito。

我從 Baeldung 找到了這兩個帖子,它們像往常一樣只給出了特定場景的特定答案,而不是一般解決方案: https://www.baeldung.com/injecting-mocks-in-spring https://www.baeldung。 com/junit-5-runwith

長話短說,我找到了如下解決方案:

  1. 在集成測試的測試文件夾中為您的組件創建如下配置 class(下面的示例是我想要集成測試攔截器組件;我已經編輯了名稱): 在此處輸入圖像描述

  2. 您可以模擬 bean,也可以實例化沒有依賴項的 bean(可以說是葉 bean)

  3. 然后在您的集成測試中,您可以使用后一個配置。 為了讓您的組件在測試(剪切)下滿足其依賴性。 我的攔截器有 3 個依賴級別: 在此處輸入圖像描述

  4. 最后,在您的集成測試中,您可以使用以下方法來模擬您模擬出的when(cut.getInitRequestRepo().initRequest(ArgumentMatchers.any(InParamInitRequest.class))).thenReturn(outParamInitRequest);的方法調用:

我使用的 POM 依賴項:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
            <scope>test</scope>
        </dependency>
 <!-- Testing with Mocks -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-inline</artifactId>
            <version>3.11.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
            <version>3.11.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.7.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.10.0</version>
            <scope>test</scope>
        </dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM