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>
스프링 부트 애플리케이션
Employee.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() 메서드:
모의 EmployeeService의 saveEmployee() 메서드가 지정된 Employee 객체를 사용하여 정확히 한 번 호출되었는지 확인합니다.
메서드가 한 번 호출되었는지 확인합니다. never() 또는 atLeastOnce()와 같은 다른 옵션은 다양한 확인 요구에 사용될 수 있습니다.
verify()가 왜 유용한가요?
예상되는 상호 작용 보장: 테스트된 논리가 의도한 대로 종속 구성 요소와 상호 작용하는지 확인합니다.
오버콜 방지: 메소드가 필요 이상으로 호출되지 않도록 하여 중복되거나 원치 않는 로직을 강조 표시할 수 있습니다.
읽기 쉬운 테스트: 구성 요소 간에 예상되는 상호 작용을 명확하게 전달합니다.
테스트 출력
saveEmployee() 메소드가 한 번 호출되면 테스트가 통과됩니다. 그렇지 않으면 예상한 상호 작용이 발생하지 않았음을 나타내는 어설션 오류와 함께 실패합니다.
위 내용은 Mockito 예제의 verify() 메서드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!