Spring Boot mockito的问题,单元测试

h5qlskok  于 2022-11-05  发布在  Spring
关注(0)|答案(1)|浏览(257)

我正在用mockito进行单元测试,在执行.保存()之后,我在存储库中得到了空值。
我的测试:

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

传递的userToPassParam参数的值:x1c 0d1x返回预期对象

我只对待对象的3个值,“userName,password,confirmPassword”,其他值对我无关紧要。
当我试图通过测试时:用户服务实现

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

用户有一个“before保存”值。当它保存时,我得到一个null。

在repository.save(object)之后,由.保存“模拟对象”返回的对象为空。
我不太明白为什么.保存返回null,而在“when”中我指定了返回什么。这就好像mockito没有拦截.save()来返回对象一样。
注意:我使用的是Junit 5,Mockito 4.6.1
我希望.保存()返回“用户”,就像我在@BeforeEach void setUp()中指定userDaoRepository.save。也就是说,拦截.保存(),以便传回对象。

n3schb8v

n3schb8v1#

我已经用ArgumentMatchers修复了这个问题。由于某些未知的原因,Mockito需要它。
导入静态org.mockito.ArgumentMatchers.any;
如果userDaoRepository.save。
信息来源:Here

  • 注意:我还实现了equals和hashCode重写,但它不会检测到它们。*

相关问题