Szenario: Verspotten eines Dienstes zum Testen eines Controllers
package com.example.demo.model; public class Employee { private String id; private String name; // Constructors, 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 Employee getEmployeeById(String id) { // Simulate fetching employee from a database return new Employee(id, "Default Name"); } }
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.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class EmployeeController { private final EmployeeService employeeService; public EmployeeController(EmployeeService employeeService) { this.employeeService = employeeService; } @GetMapping("/employees/{id}") public Employee getEmployee(@PathVariable String id) { return employeeService.getEmployeeById(id); } }
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.*; import static org.junit.jupiter.api.Assertions.*; class EmployeeControllerTest { @Mock private EmployeeService employeeService; @InjectMocks private EmployeeController employeeController; public EmployeeControllerTest() { MockitoAnnotations.openMocks(this); // Initialize mocks } @Test void testGetEmployee() { // Arrange: Use when().thenReturn() to mock service behavior when(employeeService.getEmployeeById("1")).thenReturn(new Employee("1", "John Doe")); // Act: Call the controller method Employee employee = employeeController.getEmployee("1"); // Assert: Verify the returned object assertNotNull(employee); assertEquals("1", employee.getId()); assertEquals("John Doe", employee.getName()); // Verify the mocked service was called verify(employeeService, times(1)).getEmployeeById("1"); } }
Erklärung
when().thenReturn():
Verspottet das Verhalten von EmployeeService.getEmployeeById("1"), um ein bestimmtes Employee-Objekt zurückzugeben, wenn es mit "1" aufgerufen wird.
Abhängigkeitsinjektion:
@Mock erstellt eine Nachbildung des EmployeeService.
@InjectMocks injiziert den simulierten EmployeeService in den EmployeeController.
Überprüfen:
verify(employeeService, times(1)).getEmployeeById("1") stellt sicher, dass die simulierte Methode genau einmal aufgerufen wurde.
Behauptung:
Validiert das zurückgegebene Employee-Objekt anhand der erwarteten Werte.
Ausgabe
Wenn der Test ausgeführt wird:
Es wird die Controller-Methode aufgerufen.
Der simulierte Dienst gibt das Stub-Employee-Objekt zurück.
Der Test wird bestanden, wenn:
Das zurückgegebene Employee-Objekt entspricht den erwarteten Werten.
Die simulierte Servicemethode wurde mit der erwarteten Häufigkeit aufgerufen.
Dies ist eine saubere, praktische Möglichkeit, thenReturn() in einer Spring Boot-Anwendung zu verwenden, um die Controller-Logik zu testen, ohne sich auf die tatsächliche Service-Implementierung zu verlassen.
Das obige ist der detaillierte Inhalt vonthenReturn()-Methode im Mockito-Beispiel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!