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