使用 JUnit 5 測試 Micronaut 簡介
1. 概述
Micronaut 為包括 JUnit 5 和 Spock 在內的測試框架提供一流的支援。 JUnit 5 在 Java 生態系統中被廣泛使用, Micronaut 透過專用的測試模組與其集成,從而簡化了單元測試和集成測試的編寫。
在本教程中,我們將探討如何在 Micronaut 應用程式中設定 JUnit 5 測試。此外,我們還將編寫一個範例測試,以展示 Micronaut 如何讓應用程式元件的測試變得輕鬆便捷。
2. Maven 依賴項
要為 Macronaut 應用程式編寫單元測試,讓我們將micronaut-test-junit5和junit-jupiter-engine依賴項加入pom.xml中:
<dependency>
<groupId>io.micronaut.test</groupId>
<artifactId>micronaut-test-junit5</artifactId>
<version>4.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>6.0.1</version>
<scope>test</scope>
</dependency>
micronaut-test-junit5依賴項實現了 Micronaut 和 JUnit 5 之間的集成,從而啟用了應用程式上下文管理和依賴注入等功能。 junit junit-jupiter-engine相依性則包含了負責執行 JUnit 測試的測試引擎。
另外,讓我們把[junit-jupiter-api](https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api)和[mockito-core](https://mvnrepository.com/artifact/org.mockito/mockito-core)依賴項加入pom.xml中:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>6.0.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.20.0</version>
<scope>test</scope>
</dependency>
junit-jupiter-api提供了 JUnit 5 的核心註解和斷言工具,例如@Test和Assertions mockito-core依賴項可讓我們建立模擬對象,從而可以透過以受控的、特定於測試的行為替換真實依賴項來隔離被測單元。
3. 核心測驗概念
要在 Micronaut 中編寫單元測試,我們需要使用@MicronautTest註解來標記測試類別。此註解會啟動ApplicationContext,使所有 bean 都可供注入。在需要時(例如測試 HTTP 控制器時),Micronaut 會自動啟動一個EmbeddedServer 。
此外, @MicronautTest會為我們管理應用程式生命週期。它會在測試開始前啟動應用程式上下文,並在測試結束後將其關閉。這省去了手動設定的麻煩。因此,使用@MicronautTest運行測試會執行一個真實的 Micronaut 應用程式上下文。
3.1. 使用依賴注入測試服務
Micronaut 透過@Inject註解支援在測試中註入依賴項。這允許我們將任何 bean 注入到測試類別中。
讓我們透過啟動一個簡單的 Micronaut 專案來示範一下。首先,我們寫一個名為AdditionService介面:
public interface AdditionService {
Integer sum(int a, int b);
}
這裡,介面定義了一個簡單的加法契約。使用介面還可以方便地在測試期間對服務進行模擬。
接下來,我們來實作這個介面:
@Singleton
public class AdditionServiceImpl implements AdditionService {
@Override
public Integer sum(int a, int b) {
return a + b;
}
}
這裡,我們定義了sum()方法的自訂實作。 @Singleton註解將此實作註冊為 Micronaut 應用程式上下文中的 bean。
接下來,我們寫一個簡單的測試來測試服務類別:
@MicronautTest(startApplication = false)
class AdditionServiceUnitTest {
@Inject
AdditionService additionService;
@Test
void givenAdditionService_whenAddingTwoIntegers_thenReturnSum() {
assertEquals(4,additionService.sum(2,2));
}
}
在上面的程式碼中,我們將AdditionService注入到測試類別中,呼叫sum()方法,並斷言結果。此外,我們使用startApplication=false選項指示 Micronaut 不要啟動伺服器。這對於非 HTTP 測試非常有用。
3.2. 嘲笑豆子
此外, Micronaut 允許我們使用@MockBean註解來模擬 bean 。這在我們想要隔離邏輯或用測試替身替換實際實作時非常有用。
讓我們使用模擬服務重寫前面的範例。首先,讓我們建立一個新的測試類別:
@MicronautTest
class AdditionServiceMockingUnitTest {
@Inject
AdditionService additionService;
@MockBean(AdditionService.class)
AdditionService additionService() {
return mock(AdditionService.class);
}
在這裡,我們使用@MockBean註解在測試期間用 Mockito mock取代原始的AdditionService bean。
接下來,我們編寫一個測試方法來模擬該行為:
@Test
void givenAdditionService_whenAddingTwoIntegers_thenReturnSum() {
when(additionService.sum(2, 2)).thenReturn(4);
assertEquals(4, additionService.sum(2, 2));
}
在這裡,我們定義模擬方法的預期行為,並驗證我們的程式碼是否能正確地與它互動。
4. 測試 HTTP 控制器
接下來,讓我們透過新增控制器類別來擴展我們的範例:
@Controller
public class AdditionController {
private final AdditionService additionService;
public AdditionController(AdditionService additionService) {
this.additionService = additionService;
}
@Get(uri = "/sum", produces = MediaType.TEXT_PLAIN)
public Integer sum(@QueryValue("firstNumber") int firstNumber,
@QueryValue("secondNumber") int secondNumber) {
return additionService.sum(firstNumber, secondNumber);
}
}
在上面的程式碼中,我們公開了一個/sum端點,它接受兩個整數作為查詢參數,並將計算委託給AdditionService 。
接下來,我們來測試求和端點。首先,讓我們將一個HttpClient實例注入到測試類別中:
@Inject
@Client("/")
HttpClient client;
當測試類別使用@MicronautTest註解並使用@Client(“/”)時, Micronaut 會自動啟動EmbeddedServer ,以便可以針對應用程式執行 HTTP 請求。
接下來,我們來為/sum端點寫一個測試:
@Test
void givenSumUrl_whenPassingTwoIntegersAsQuery_thenReturnSum() {
when(additionService.sum(20, 25)).thenReturn(45);
Integer result = client.toBlocking()
.retrieve(HttpRequest.GET("/sum?firstNumber=20&secondNumber=25"), Integer.class);
assertEquals(45, result);
}
這裡,我們使用@MockBean註解來模擬AdditionService ,從而可以單獨測試控制器。測試透過HttpClient向嵌入式伺服器發送真實的 HTTP 請求,取得回應,並斷言回應值與預期值相符。
值得注意的是,我們模擬了AdditionService ,並且控制器使用了模擬的協作者而不是真正的實作。
5. 結論
本文介紹如何在 Micronaut 應用程式中設定和撰寫 JUnit 測試。我們討論了核心測試概念,包括使用@MicronautTest註解、將 bean 注入測試類別以及使用@MockBean模擬依賴項。此外,我們還了解如何透過 Micronaut 的嵌入式伺服器發送真實的 HTTP 請求來測試 HTTP 控制器。
與往常一樣,範例的完整原始程式碼可在 GitHub 上找到。