为什么模拟接受任何参数?

时间:2018-06-19 14:42:32

标签: junit mockito spring-test

我有服务舱:

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    @Transactional
    public void registerUser(User user) {
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));
        userRepository.save(user);
    }
}

我有以下测试:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTests {

    private UserRepository userRepository = Mockito.mock(UserRepository.class);

    private UserService userService = new UserService(userRepository);

    @Test(expected = Exception.class)
    public void testCreateUser(){
        User user = new User(null, "Glass", "123123", "glass999@mail.ru");
        when(userRepository.save(null)).thenThrow(new Exception());
        userService.registerUser(user);
    }
}

我的问题是测试为什么通过?仅当userRepository的save方法接受null时,它才能通过。但是我传递了用户对象,而不是null,并且save方法实际上接受了用户对象。有人知道答案吗?

2 个答案:

答案 0 :(得分:0)

检查运行测试时遇到的异常。我假设它将是Spring DAO异常。 您正在嘲笑userRepository,但定义的条件是绝对值,即null

 when(userRepository.save(null)).thenThrow(new Exception());

因此,仅当您使用绝对参数为null调用userRepository时,才会调用模拟方法。 在您的情况下,我认为它不调用模拟方法。相反,它正在尝试在引发异常的userRepository引用上调用实际方法。

因此您确实会得到一个异常,但这不是由于定义的模拟条件/方法所致。

您可以调试并确认引发了什么异常,应该予以澄清。

答案 1 :(得分:0)

我找到了原因。问题在于userRepository.save方法的签名中没有Exception异常。 Here the similar problem