提问者:小点点

mockito的问题。单元测试


我正在使用mockito进行单元测试,在执行. save()之后,我在存储库中得到了null。

我的测试:

....
    @BeforeEach
    void setUp() {
        // USUARIO
        user = new User();
        user.setUserName("Username A");
        user.setPassword("Pass A");
        user.setConfirmPassword("Pass A");
    }


    @MockitoSettings(strictness = Strictness.LENIENT)
    @Test
    void createUserNoExistValidConfirmation() throws Exception {
        User userToPassParam = new User();
        userToPassParam.setUserName("Username_Aa");
        userToPassParam.setPassword("Pass A");
        userToPassParam.setConfirmPassword("Pass A");
        // checkUserNameAvailable
        Mockito.when(userDaoRepository.findByUserName(userToPassParam.getUserName())).thenReturn(Optional.ofNullable(user));
        // -- checkPasswordValid
        Mockito.when(bCryptPasswordEncoder.encode(userToPassParam.getPassword())).thenReturn(user.getPassword());
        // -- save
        Mockito.when(userDaoRepository.save(userToPassParam)).thenReturn(user);

        User userToCallServiceImpl = new User();
        userToCallServiceImpl.setUserName("Username A");
        userToCallServiceImpl.setPassword("Pass A");
        userToCallServiceImpl.setConfirmPassword("Pass A");
        User user = userServiceImpl.createUser(userToCallServiceImpl); // HERE GET NULLS

        System.out.println("User: " + user);
        System.out.println("this.user: " + this.user);
        Assertions.assertEquals(user.getUserName(), this.user.getUserName());
    }
.....

我只处理对象的3个值,“userName、passd-Password”其他值对我来说无关紧要。

当我尝试通过测试时:userServiceImpl

@Override
public User createUser(User user) throws Exception {
    if (checkUserNameAvailable(user) && checkPasswordValid(user)) {
        // cogemos el estado de la DB para más adelante: user = save()
        String encodePassword = bCryptPasswordEncoder.encode(user.getPassword());
        user.setPassword(encodePassword);
        user = userDaoRepository.save(user);
    }
    return user;
}

repository.save(object)后,. save-mock object返回的对象为null。

我不太明白为什么. save返回null,而在“当”中我指定要返回什么。就好像mockito没有拦截.save()来返回对象。

注意:我使用JUnit 5,Mockito 4.6.1

我期望. save()返回我在my@Before每一个void setUp(){…}中指定的用户。Mockito.time(userDaoRepository.save(userToPassParam)).thenBack(user);也就是说,.save()的截取,以便它返回对象。


共1个答案

匿名用户

我已经用一个参数匹配器修复了这个问题。出于某种未知的原因,Mockito需要它。

导入静态org. mockita.ArgumentMatcher.any;

模拟i到。当(userDaoRepository.save(任何(用户。类)))。然后返回(用户);

信息来源:这里

注意:我还实现了equals和hashCode覆盖,但它不会检测到它们。