Java Mockito PotentialStubbingProblem: ошибка несоответствия аргументов строгого отключения

#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);