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