Mockito在JUnit中处理void方法

huangapple go评论123阅读模式
英文:

Mockito with void method in JUnit

问题

  1. 我已经实现了一个简单的Spring Boot CRUD应用程序来编写测试用例我在删除操作中遇到了一些问题当我使用`Mockito.when`方法时它期望一个返回值但我的删除方法是无返回类型的
  2. **Service**
  3. @Service
  4. public class EmployeeServiceImpl implements EmployeeService {
  5. private EmployeeDAO employeeDAO;
  6. @Autowired
  7. public EmployeeServiceImpl(EmployeeDAO employeeDAO) {
  8. this.employeeDAO = employeeDAO;
  9. }
  10. @Override
  11. public void deleteEmployee(Employee emp) throws IllegalArgumentException {
  12. employeeDAO.delete(emp);
  13. }
  14. }
  15. **ServiceTest**
  16. @ExtendWith(SpringExtension.class)
  17. @SpringBootTest
  18. public class EmployeeServiceImplTest {
  19. @MockBean
  20. private EmployeeDAO employeeDAO;
  21. @Autowired
  22. private EmployeeService employeeService;
  23. @Test
  24. public void testDeleteEmployee() {
  25. int empId = 1054;
  26. Employee employee = employee_2();
  27. employee.setEmpId(empId);
  28. // 如何为void方法编写测试用例
  29. }
  30. private Employee employee_2() {
  31. Employee employee = new Employee();
  32. employee.setEmpName("NafazBenzema");
  33. employee.setSalary(12000.00);
  34. return employee;
  35. }
  36. }
英文:

I have implemented a simple spring boot crud application to write test cases. I have faced a bit of trouble with the delete operation. When I use Mockito.when method then it is expected a return value and my delete method is non-return type.

Service Class

  1. @Service
  2. public class EmployeeServiceImpl implements EmployeeService {
  3. private EmployeeDAO employeeDAO;
  4. @Autowired
  5. public EmployeeServiceImpl(EmployeeDAO employeeDAO)
  6. {
  7. this.employeeDAO=employeeDAO;
  8. }
  9. @Override
  10. public void deleteEmployee(Employee emp) throws IllegalArgumentException{
  11. employeeDAO.delete(emp);
  12. }
  13. }

ServiceTest class

  1. @ExtendWith(SpringExtension.class)
  2. @SpringBootTest
  3. public class EmployeeServiceImplTest {
  4. @MockBean
  5. private EmployeeDAO employeeDAO;
  6. @Autowired
  7. private EmployeeService employeeService;
  8. @Test
  9. public void testDeleteEmployee()
  10. {
  11. int empId=1054;
  12. Employee employee=employee_2();
  13. employee.setEmpId(empId);
  14. // how to write test case for void method
  15. }
  16. private Employee employee_2()
  17. {
  18. Employee employee=new Employee();
  19. employee.setEmpName("NafazBenzema");
  20. employee.setSalary(12000.00);
  21. return employee;
  22. }
  23. }

答案1

得分: 16

你可以在你的模拟对象上使用 doNothing 或 doThrow 来模拟模拟对象的行为。

  1. Mockito.doNothing().when(employeeDAO).delete(any());

或者

  1. Mockito.doThrow(new RuntimeException()).when(employeeDAO).delete(any());

然而,实际上并不需要使用 doNothing,因为对于具有 void 返回类型的模拟函数,这将是默认行为。
不过你可能希望使用 verify 来验证是否调用了这个方法。例如:

  1. verify(employeeDAO).delete(any());
英文:

You can either use doNothing or doThrow on your mock to mock the behaviour of your mock.

  1. Mockito.doNothing().when(employeeDAO).delete(any());

or

  1. Mockito.doThrow(new RuntimeException()).when(employeeDAO).delete(any());

However, doNothing is not actually needed as this would be the default behaviour for a mock function with a void return type.
You may want however to verify that this method was called. For example:

  1. verify(employeeDAO).delete(any());

答案2

得分: 6

你可以使用Mockito.doNothing()

  1. Mockito.doNothing().when(employeeDAO).deleteEmployee(any());
英文:

You can use Mockito.doNoting():

  1. Mockito.doNothing().when(employeeDAO).deleteEmployee(any());

答案3

得分: 0

谢谢Omer。

但在我的情况下,我不得不将 employeeService 替换为 employeeDAOemployeeService 被注解为 @Autowired,并且它会抛出 NotaMockAnnotation 异常。

  1. Mockito.doNothing().when(employeeDAO).delete(employee);
英文:

Thank you omer.

But in my case, I had to replace employeeService with employeeDAO.The employeeService is annotated with @Autowired annotation and it throws NotaMockAnnotation exception.

  1. Mockito.doNothing().when(employeeDAO).delete(employee);

huangapple
  • 本文由 发表于 2020年10月1日 16:29:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/64151647.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定