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时,它仍然通过了测试