Java Mockito PotentialStubbingProblem: Strict stubbing 参数不匹配错误

Java Mockito PotentialStubbingProblem: Strict stubbing argument mismatch error

我有下面的方法,我需要使用 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 result;
    }

这是我的测试方法:

@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);
    }

如果您调用:

,测试应该会通过
when(mapper.map(Optional.of(agroupmentObject), UserUnionProfile.class)).thenReturn(agroupmentObject);

而不是:

when(mapper.map(agroupmentObject, UserUnionProfile.class)).thenReturn(agroupmentObject);

因为在 validateIfUserExistsInAgroupmentTable() 中,您映射的不是 UserUnionProfile,而是 Optional<UserUnionProfile>

但是,我认为您真正想要的是更改方法的实现并映射 Optional 的实际内容,而不是 Optional 本身:

return mapper.map(agroupmentObject.get(), UserUnionProfile.class);