#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.