java - Mockito 模拟没有被调用 - ArgumentCaptor 被忽略
问题描述
我想在一个UserServiceImplV1
类上测试以下代码:
@Override
public void updateUserPassword(VerificationCodeDTO code, String newPassword) {
if(verificationCodeService.isValid(code)) {
UserDTOV1 user = userService.findByEmail(code.getEmail());
user.setPassword(newPassword);
userService.save(user);
verificationCodeService.delete(code.getEmail());
} else {
throw new ValidationException("Código de usuário inválido");
}
}
所以我写了以下测试:
@Test
public void updatesUserPasswordAndDeletesToken() {
UserDTOV1 userDTO = new UserDTOV1("John", "a@mail.com", "123", UserType.PESSOAFISICA, "oldPassword");
VerificationCodeDTO verificationCodeDTO = new VerificationCodeDTO("abcd", userDTO.getEmail());
when(verificationCodeService.isValid(any())).thenReturn(Boolean.TRUE);
when(userService.findByEmail("a@mail.com")).thenReturn(userDTO);
when(userService.save(any(UserDTOV1.class))).thenAnswer(invocation -> invocation.getArgument(0));
ArgumentCaptor<UserDTOV1> captor = ArgumentCaptor.forClass(UserDTOV1.class);
verify(userService, times(1)).save(captor.capture());
UserDTOV1 actual = captor.getValue();
authService.updateUserPassword(verificationCodeDTO, "newPassword");
Assert.assertEquals("newPassword", actual.getPassword());
verify(verificationCodeService, times(1)).delete(anyString());
}
我收到以下错误:
Wanted but not invoked:
userService.save(<Capturing argument>);
-> at (...).updatesUserPasswordAndDeletesToken(AuthServiceImplV1Test.java:45)
Actually, there were zero interactions with this mock.
我尝试过以很多方式捕捉论点,比如
verify(userService, times(1)).save(argThat(argument -> argument.getPassword().equals("newPasword")));
但是错误是一样的,几乎就像我的模拟没有被应用一样。不过,我正在创建它们,并且此文件中的所有其他测试都有效:
@RunWith(MockitoJUnitRunner.class)
public class AuthServiceImplV1Test {
@Mock
private UserServiceImplV1 userService;
@Mock
private VerificationCodeServiceImplV1 verificationCodeService;
@InjectMocks
private AuthServiceImplV1 authService;
提前致谢。
解决方案
在调用被测方法之前,您正在验证模拟是否已被调用。所以那时,还没有调用模拟。
推荐阅读
- snowflake-cloud-data-platform - 我们可以详细了解 Snowpipe 的成本吗?
- node.js - 如何使用 sequelize + node js 播种枢轴平板电脑
- signtool - 用于使用 Microsoft signtool /dlib 进行签名的自定义 DLL
- python - python 仅在列表的一部分上使用 random.shuffle()
- reactjs - 如何在 Heroku 上部署 Golang/mongodb/react 应用程序?
- blazor - 为 blazor 内联代码提供代码覆盖率
- java - 如何在 Wildfly 23 中浏览 Infinispan 缓存数据
- php - 将系数应用于每条线时的四舍五入会导致心理价格错误
- javascript - Nuxtjs/Vuejs 观察者由于值的变化而陷入无限循环
- python - 只有当列的值在数据帧中不同时,熊猫才会合并