通过JUnit DAO类测试

时间:2015-03-24 20:28:29

标签: java maven junit dao

我有一个DAO类,我需要测试名为 getItemById()的方法,该方法从DB表中返回 Item 对象。

只要我明白我必须在该测试中创建 Item 对象并检查它是否等于从方法返回?或者我必须检查它是否返回 Item 对象?

如果表格为空或根本没有具有该ID的行,该怎么办?

对不起,这是一个非常新手的问题,但我无法在脑海中说清楚。请帮忙!

2 个答案:

答案 0 :(得分:0)

对数据库运行测试无法预测其中的内容无效;任何足以适应不断变化的数据的弹性测试都将毫无价值,以确认被测代码是否真正做到了正确的事情。我会让测试使用自己的数据库实例,这样就不会有其他用户干扰我测试的干扰,或者我的测试从其他人那里改变数据。理想的选择是内存数据库,如H2,测试可以实例化,并在完成后丢弃。这样,测试可以在任何地方运行(例如在CI服务器上),结果相同。

测试需要运行ddl来创建架构并在执行之前填充数据库。您可以使用不同的工具。 DbUnit很受欢迎,还有一个名为DBSetup的替代方案,它应该不那么复杂。您可以为不同的方案分别提供测试数据。 DbUnit具有从数据库中提取数据的工具,以便更轻松地创建测试数据。

由于数据库在您的控制之下,您可以根据需要填充它,因此您应该根据填充的数据验证返回的对象的字段是否符合预期。尽可能使测试具体。

为了测试SQL以及如何将对象映射到结果集,使用数据库是有意义的。对于某些部分,使用不接触数据库并使用模拟的单元测试是有意义的。例如,最好确认连接在所有情况下都是关闭的,使用模拟比在代码中导致SQLException更容易。

如果注入DBConnection类而不是在方法中实例化,则使用模拟测试会更容易。如果您更改了注入DBConnection的代码,那么您可以编写一个单元测试(使用不使用数据库的模拟测试)来检查连接是否关闭。

答案 1 :(得分:-2)

要进行单元测试,您应该分三步走:

  1. 准备测试环境(例如,用已知的测试数据填充数据库) - 所以你不会问表是否为空。
  2. 执行测试并断言结果
  3. 进行清理 - 所以测试不会对其他测试产生影响
  4. 此外,您应该测试所有场景,因为您需要处理所有场景