return 类型为 void 时的单元测试保存方法

Unit testing save methods when return type is void

在return类型为void的情况下,有没有办法为DAO层的save方法编写单元测试?我在 spring 引导项目中使用 Log4j、Junit。

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

如果方法是void,那么它有side-effects, otherwise it would be a no-op

因此您调用该方法,然后检查是否发生了所需的 side-effect。

例如setFoo(7) 应该意味着 getFoo() returns 7,虽然单元测试简单 getter/setter 方法是浪费时间。

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

有几种方法可以对 returns 无效的方法进行单元测试。

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

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

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

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

根据您的意见,您需要为保存方法编写单元测试。试试这个示例代码,

@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());
}

编写可测试的代码对于现代开发人员来说很重要。您应该明白,带有 void 的方法对单个 reason.it 是不利的,无论如何都无法测试。我建议您采取以下行动

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

@Teguwih