java - Mockito mock 没有被调用 - ArgumentCaptor 被忽略

标签 java unit-testing testing mocking mockito

我想在 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;

提前致谢。

最佳答案

您要验证在调用被测方法之前是否调用了模拟。所以此时,模拟还没有被调用。

关于java - Mockito mock 没有被调用 - ArgumentCaptor 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59377456/

相关文章:

ruby-on-rails - 如何 stub /模拟 Rails 2.3 中功能测试的辅助方法?

java - 有没有一种方法可以从不同的包(或类)运行一个定义的和 X 个随机 TestNG 测试?

javascript - 元素上的 Angular 模拟方法

unit-testing - 单元测试和 Web 应用程序 - 资源

python - 如何使用 Python 测试 API 客户端?

testing - 将 HTTPS 与 remoteConnection 选项结合使用

java - setEntityMethod 和 SetRequestEntityMethod 之间的区别

Java生成一个随机的阿拉伯文字符串

java - Java 8 中带流的字符串集到 HashMap

java - hibernate :Testing Daos