Mockito 中的 verify() 方法用於確認與模擬物件發生了特定的交互作用。當您想要確保在程式碼執行期間使用特定參數呼叫某個方法時,這在測試中特別有用。
以下是一個具有服務和控制器層的 Spring Boot 應用程式範例,其中在測試中使用了 verify() 方法。
使用 Spring Web 相依性建立 Spring Boot Starter 專案並執行以下範例
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>VerifySpringBootExample</artifactId> <version>0.0.1-SNAPSHOT</version> <name>VerifySpringBootExample</name> <description>Demo project for Spring Boot</description> <url/> <licenses> <license/> </licenses> <developers> <developer/> </developers> <scm> <connection/> <developerConnection/> <tag/> <url/> </scm> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Spring Boot 應用
員工.java
package com.example.demo.model; public class Employee { private String id; private String name; // Constructor, Getters, and Setters public Employee(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
EmployeeService.java
package com.example.demo.service; import com.example.demo.model.Employee; import org.springframework.stereotype.Service; @Service public class EmployeeService { public void saveEmployee(Employee employee) { // Business logic to save the employee (e.g., in a database) System.out.println("Employee saved: " + employee.getName()); } }
EmployeeController.java
package com.example.demo.controller; import com.example.demo.model.Employee; import com.example.demo.service.EmployeeService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class EmployeeController { private final EmployeeService employeeService; public EmployeeController(EmployeeService employeeService) { this.employeeService = employeeService; } @PostMapping("/employees") public void saveEmployee(@RequestBody Employee employee) { employeeService.saveEmployee(employee); } }
使用 Mockito 進行 JUnit 檢定
EmployeeControllerTest.java
package com.example.demo.controller; import com.example.demo.model.Employee; import com.example.demo.service.EmployeeService; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.mockito.Mockito.*; class EmployeeControllerTest { @Mock private EmployeeService employeeService; @InjectMocks private EmployeeController employeeController; public EmployeeControllerTest() { MockitoAnnotations.openMocks(this); // Initialize mocks } @Test void testSaveEmployee() { // Arrange Employee employee = new Employee("1", "John Doe"); // Act employeeController.saveEmployee(employee); // Assert // Verify that the saveEmployee method was called once with the correct argument verify(employeeService, times(1)).saveEmployee(employee); } }
說明
用 @Mock 嘲笑:
EmployeeService 是模擬的,這意味著它的行為可以在不依賴實際實現的情況下進行控制。
使用 @InjectMocks 注入模擬:
EmployeeController 使用模擬的 EmployeeService。
verify() 方法:
確認使用指定的 Employee 物件呼叫了模擬的 EmployeeService 的 saveEmployee() 方法一次。
確保該方法被呼叫一次。其他選項如 never() 或 atLeastOnce() 可用於不同的驗證需求。
為什麼 verify() 有用?
確保預期的交互作用:確認測試的邏輯會如預期與依賴元件互動。
防止過度呼叫:確保方法呼叫次數不會超過必要的次數,這可能會突出顯示冗餘或不需要的邏輯。
可讀測試:清楚傳達組件之間的預期交互作用。
測試輸出
如果呼叫 saveEmployee() 方法一次,測試就會通過。否則,它將失敗並出現斷言錯誤,表明預期的交互沒有發生。
以上是Mockito 範例中的 verify() 方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!