Mockito @Spy вызывает реальный метод во время определения насмешливого поведения

#spring #spring-boot #mockito #spring-test #springmockito

#весна #spring-boot #mockito #spring-test #springmockito

Вопрос:

У меня есть обычное приложение spring boot, состоящее из контроллера и сервисного уровня. База данных не задействована, так как я использую другой rest api для хранения данных.

Теперь я хочу получить доступ к своему контроллеру и поэтому хочу частично поиздеваться над своим сервисом. Частично потому, что у меня есть один метод в it, который берет dto и преобразует его в мою бизнес-модель. Я знаю, что это также можно решить с помощью конструктора бизнес-модели, но в любом случае я пришел к следующей проблеме:

код

Контроллер

 @RestController
public class RegistrationController {

@Autowired
private UserRegistrationService userRegistrationService;

@PostMapping(value = "/user", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<UserId> createUser(@RequestBody @Valid UserDto userDto) {
    KeycloakUserRepresentation keycloakUserRepresentation = userRegistrationService.convertUserDtoToKeycloakUserRepresentation(userDto);
    UserId userId = userRegistrationService.createNewUser(keycloakUserRepresentation);
    return new ResponseEntity<>(userId,HttpStatus.CREATED);
}
 

ТЕСТ

 @SpringBootTest
@AutoConfigureMockMvc
@ExtendWith({RestDocumentationExtension.class})
@AutoConfigureRestDocs
class RegistrationControllerRegistrationTest {

    private static final UserDto testUsertDto = new UserDto();

    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;
    @Spy
    private UserRegistrationServiceImpl userRegistrationService;
 

В моем методе тестирования я определяю:

 doReturn(testUserId).when(userRegistrationService).createNewUser(any(KeycloakUserRepresentation.class));
 

ПРОБЛЕМА:

Я ожидаю, что, хотя в моем тесте не определено doSomething , преобразование UserDTO в представление keycloak выполняется оригинальным методом. Кажется, это работает, так как при отладке в моем контроллере представление keycloakUserRepresentation имеет правильные значения. Проблема в том, что на следующем шаге

createNewUser

метод не является заглушенным / высмеянным. Исходный метод выполняется, и поэтому мой тест завершается неудачей. Чего я хочу, так это того, что когда я предоставляю метод doSomething в моем тестовом примере, я хочу, чтобы исходный метод был высмеян.

Ответ №1:

Похоже, это работает, поскольку при отладке в моем контроллере представление keycloakUserRepresentation имеет правильные значения.

Это сработало, потому что компонент вообще не отслеживался. Хотя @Spy это может помочь в создании объекта mocked, это не приводит к созданию mocked Spring bean в контексте вашего тестового приложения. Используется @SpyBean для того, чтобы Mockito отслеживал компонент в контексте приложения Spring.