#java #junit #mockito
#java #junit #mockito
Вопрос:
У меня есть метод ниже, который мне нужно протестировать с помощью mockito:
public User update(project.models.domain.User userObject) {
var user = validateIfUserExists(userObject);
var agroupmentFoundInDatabase = validateIfUserExistsInAgroupmentTable(userObject);
User result = userRepository.save(user);
if(!agroupmentFoundInDatabase.getProfileCode().equals(userObject.getProfile().getCode())) {
userUnionProfileRepository.delete(agroupmentFoundInDatabase);
userUnionProfileRepository
.save(UserUnionProfile.builder().userCode(userObject.getId())
.profileCode(userObject.getProfile().getCode()).build());
}
return resu<
}
Это мой метод тестирования:
@Test
public void update() throws Exception {
br.com.rd.productmodels.product.domain.User userObject = mockUser();
User user = User.builder().code(135).description("test").build();
when(repository.findById(any())).thenReturn(Optional.of(user));
when(mapper.map(userObject, User.class)).thenReturn(user);
UserUnionProfile agroupmentObject = UserUnionProfile.builder().userCode(135).profileCode(12).build();
when(userUnionProfileRepository.findById(any())).thenReturn(Optional.of(agroupmentObject));
when(mapper.map(agroupmentObject,UserUnionProfile.class)).thenReturn(agroupmentObject);
when(repository.save(any())).thenReturn(user);
User entity = service.update(userObject);
verify(repository).save(any());
assertNotNull(entity);
}
Но когда я запускаю свой тест, он выдает мне следующее сообщение:
PotentialStubbingProblem: Strict stubbing argument mismatch. Please check:
- this invocation of 'map' method:
mapper.map(Optional[UserUnionProfile(userCode=135, profileCode=12)],class project.domain.UserUnionProfile
);
Я пытался использовать @MockitoSettings(strictness = Strictness.LENIENT)
. Ошибка исчезает, но мой результат равен нулю после выполнения строки mapper.map(Optional[UserUnionProfile(userCode=135, profileCode=12)],class project.domain.UserUnionProfile
. Что мне делать?
#Подробнее о методе обновления, который я пытаюсь протестировать. Вот другие вызываемые методы:
private User validateIfUserExists(project.models.domain.User userObject) {
var user = userRepository.findById(userObject.getId());
if (user.isEmpty()) {
throw new UserNotFoundException(userObject.getId());
}
return mapper.map(userObject, User.class);
}
private UserUnionProfile validateIfUserExistsInAgroupmentTable(project.models.domain.User userObject) {
var agroupmentObject = userUnionProfileRepository.findById(userObject.getId());
if (agroupmentObject.isEmpty()) {
throw new AgroupmentNotFoundException(userObject.getId());
}
return mapper.map(agroupmentObject, UserUnionProfile.class);
}
Ответ №1:
Тест должен пройти, если вы вызвали:
when(mapper.map(Optional.of(agroupmentObject), UserUnionProfile.class)).thenReturn(agroupmentObject);
вместо:
when(mapper.map(agroupmentObject, UserUnionProfile.class)).thenReturn(agroupmentObject);
потому что в validateIfUserExistsInAgroupmentTable()
вы не сопоставляете a UserUnionProfile
, а an Optional<UserUnionProfile>
.
Однако я думаю, что на самом деле вы хотите изменить реализацию метода и отобразить фактическое содержимое Optional
, а не Optional
само:
return mapper.map(agroupmentObject.get(), UserUnionProfile.class);