【问题标题】:Unit testing save methods when return type is void返回类型为 void 时的单元测试保存方法
【发布时间】:2019-10-27 07:06:19
【问题描述】:

当返回类型为 void 时,有没有办法为 DAO 层中的保存方法编写单元测试?我在 Spring Boot 项目中使用 Log4j、Junit。

我尝试了很多方法来断言它们。但由于它们没有返回任何值,我无法断言它们。

【问题讨论】:

  • 你要断言什么?
  • 我实际上需要学习一种为 void 方法编写单元测试的方法。

标签: java junit5 spring-boot-test


【解决方案1】:

如果方法是void,那么它有side-effects,否则它就是no-op

所以你调用该方法,然后检查是否发生了所需的副作用。

例如setFoo(7) 应该意味着 getFoo() 返回 7,尽管单元测试简单的 getter/setter 方法是浪费时间。

通常使用 模拟对象 来检测副作用,但这完全取决于预期的副作用是什么。见:What is the purpose of mock objects?

【讨论】:

  • 假设我正在尝试将一些值保存到数据库中。但是在那个保存方法中,我不会返回任何东西。在这种情况下,如何使用单元测试确保数据已成功保存到数据库中?
  • 通过模拟数据库访问对象并验证对它们进行的正确调用
  • @Teguwih 你在测试什么?数据库?别。休眠?别。那么,您在调用的代码中测试的是什么?
  • @Andreas 我是春天的新手。我使用 mysql 作为数据库和 jdbc 连接来连接到数据库。我编写了一个保存方法来将实体保存到数据库表中。但该方法不会返回任何内容。我尝试了 vimukthi_r 的回答。它似乎按我的预期工作。
【解决方案2】:

根据您的 cmets,您需要为 save 方法编写单元测试。试试这个示例代码,

@Autowired
private EmployeeDAO employeeDAO;

@Test
public void whenValidEmployee_thenShouldSave()
{
    EmployeeEntity employee = new EmployeeEntity("1", "Department Name", "Role"); //id, department name and role are passing as constructor parameters
    employeeDAO.save(employee);

    List<EmployeeEntity> employees = employeeDAO.findAll();

    //Assert
    Assert.assertEquals(employee.getId(), employees.get(0).getId());
}

【讨论】:

  • @Vimukthu_R 不测试 id 有没有办法测试员工对象内的所有字段?
  • 这是一个参考link
【解决方案3】:

作为现代开发人员,编写可测试的代码非常重要。您应该明白,带有 void 的方法之所以不好,原因只有一个。它无论如何都不可测试。我建议您采取以下措施

  1. 使用相关的返回类型改进您的代码。
  2. 值得应用 DbUnit,而不是只应用 Junit 来测试 你的 DAO 层。

@Teguwih

【讨论】:

    【解决方案4】:

    有几种方法可以对返回 void 的方法进行单元测试。

    1. 更改方法,使其返回一个值,即使您不使用该值。这不是最好的方法,但为了完整起见,我在此注明。

    2. 该方法可能会以某种方式更改对象的状态。文件已保存,值已存储在某处,参数已更改等。因此请检查应该已更改的值。您可以回读保存的文件、更改的变量、测试数据库中的数据等。

    3. Mock 对象可用于确定是否调用了方法以及行为是什么。 Java 有许多模拟对象框架,包括Easy MockJMockitMockito。如何使用模拟框架超出了此答案的范围,但我确实包含了指向各个站点的链接供您参考。

    4. 如果向方法提供了错误的输入,它可能会引发异常。这样做来测试您的方法的错误处理是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 2011-06-25
      • 2023-01-08
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多