Junit 为什么mock接受任何参数?

Junit 为什么mock接受任何参数?,junit,mockito,spring-test,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()));

我有服务课:

@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方法实际上接受用户对象。有人知道答案吗?

检查运行测试时出现的异常。我认为这将是SpringDao的一个例外。 您正在模拟userRepository,但定义的条件是绝对值,即null

 when(userRepository.save(null)).thenThrow(new Exception());
因此,只有在调用绝对参数为null的userRepository时,才会调用mock方法。 在您的情况下,我认为它不会调用mock方法。相反,它试图调用userRepository引用上的实际方法,该方法会引发异常

因此,您确实会得到一个异常,但它不是由定义的模拟条件/方法引起的


您可以调试并确认抛出了什么异常,这应该会澄清。

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

当我运行测试时,我没有得到异常,这没关系。考试通过了。但没必要,你应该得到一个例外,对吗?您的测试需要一个异常
@test(expected=exception.class)
是的,测试应该得到exception.class,并且它得到了它。但是为了抛出异常,我需要传递null对象。但我不通过空值。为什么抛出异常?正如我所说,我不认为异常是因为
when(userRepository.save(null)).thenthow(newexception())
由于调用
userRepository.save(user)
而不是通过传递null,所以实际上它调用了real方法和未执行then子句时的模拟。您应该能够看到要确认的异常类型。我可以删除null并设置另一个用户对象(用户A)。但当我通过用户B时,它仍然通过了测试