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 无效的方法进行单元测试。
更改方法,使其 returns 成为一个值,即使您不使用该值。这不是最好的方法,但为了完整起见,我在这里注明。
该方法可能会以某种方式改变对象的状态。保存了一个文件,某个地方存储了一个值,更改了参数等。因此请检查应该更改的值。可以回读一个保存的文件、一个改变的变量、一个测试数据库中的数据等
Mock 对象可用于确定是否调用了方法以及行为是什么。 Java 有许多模拟对象框架,包括 Easy Mock, JMockit and Mockito。如何使用模拟框架超出了这个答案的范围,但我确实包含了各个站点的链接供您参考。
如果向方法提供错误输入,它可能会抛出异常。这样做是为了测试您的方法的错误处理是个好主意。
根据您的意见,您需要为保存方法编写单元测试。试试这个示例代码,
@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 是不利的,无论如何都无法测试。我建议您采取以下行动
- 使用相关的 return 类型改进您的代码。
- 值得应用 DbUnit,而不是仅仅应用 Junit 来测试
你的 DAO 层。
@Teguwih
在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 无效的方法进行单元测试。
更改方法,使其 returns 成为一个值,即使您不使用该值。这不是最好的方法,但为了完整起见,我在这里注明。
该方法可能会以某种方式改变对象的状态。保存了一个文件,某个地方存储了一个值,更改了参数等。因此请检查应该更改的值。可以回读一个保存的文件、一个改变的变量、一个测试数据库中的数据等
Mock 对象可用于确定是否调用了方法以及行为是什么。 Java 有许多模拟对象框架,包括 Easy Mock, JMockit and Mockito。如何使用模拟框架超出了这个答案的范围,但我确实包含了各个站点的链接供您参考。
如果向方法提供错误输入,它可能会抛出异常。这样做是为了测试您的方法的错误处理是个好主意。
根据您的意见,您需要为保存方法编写单元测试。试试这个示例代码,
@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 是不利的,无论如何都无法测试。我建议您采取以下行动
- 使用相关的 return 类型改进您的代码。
- 值得应用 DbUnit,而不是仅仅应用 Junit 来测试 你的 DAO 层。
@Teguwih