测试数据访问对象
Testing Data Access Objects
在测试 DAO 时,我遵循这些规则:
- 使用内存数据库
- 为每个测试重置数据库数据
这适用于从数据库中 selecting。我使用 select 所需的数据设置数据库,调用我的 DAO 并验证返回的对象是否具有正确的值。
但是在测试插入、更新和删除时,它变得很难看。我必须编写自定义 select 语句来验证我的数据库中的数据是否正确 inserted/updated/deleted。因此,当我完成编写测试时,我也可以再次测试我的测试。
网络上的一些人建议从字面上模拟所有内容,但这并不能真正测试任何东西。
那么,如何测试 DAO?
您 真的不必 测试 DAO,前提是它们足够精简(它们应该如此)并且不包含业务逻辑。在为其他内容编写一些 system/integration 测试时,您会在某个时候无意中测试它们。
根据您使用的内容(ORM 框架?),您也许可以 stub/mock 东西,但很少值得这样做。
至于在 NUnit 中使用连接字符串(以便从您的测试项目中操作数据库),我认为通常没有任何问题,它比您想象的更常见。
测试 DAO 包括 3 个不同的步骤。
1) 测试 POJO(单元测试)
2) 通过(集成测试)测试 DAO
3) 测试 DAO 用户 classes.
1) 正在测试 POJO:
这个非常简单,与 DAO 测试无关。主要是为了增加项目的测试覆盖率,通常测试普通对象的 setter 和吸气剂。
2) 测试 DAO:
这是一个集成测试,它不会增加单元测试的覆盖率。在这种情况下,必须创建 运行 一个测试数据库。之后打开测试数据库会话并添加所有 daoMappers。完成此设置后,dao class 的所有方法都会被调用并一一测试。
3) 测试 DAO 用户 classes:
在单元测试实现中模拟对象是一种非常有用的方法。当您测试一个 class 并且此 class 使用其他服务、方法和 class 时;您可以轻松模拟这些服务、classes 和方法,因为它们可能已经在其他地方进行过测试。通过模拟,我们的意思是假设一个特定的方法 returns 一些特定的值或一个对象。
有很多模拟工具,例如 EasyMock、PowerMockito 和 PowerMock。在 DAO 模拟案例中(因为我们已经在上面测试了 DAO,我们可以模拟它们)我们可以使用 PowerMock 进行模拟。
在测试 DAO 时,我遵循这些规则:
- 使用内存数据库
- 为每个测试重置数据库数据
这适用于从数据库中 selecting。我使用 select 所需的数据设置数据库,调用我的 DAO 并验证返回的对象是否具有正确的值。
但是在测试插入、更新和删除时,它变得很难看。我必须编写自定义 select 语句来验证我的数据库中的数据是否正确 inserted/updated/deleted。因此,当我完成编写测试时,我也可以再次测试我的测试。
网络上的一些人建议从字面上模拟所有内容,但这并不能真正测试任何东西。
那么,如何测试 DAO?
您 真的不必 测试 DAO,前提是它们足够精简(它们应该如此)并且不包含业务逻辑。在为其他内容编写一些 system/integration 测试时,您会在某个时候无意中测试它们。
根据您使用的内容(ORM 框架?),您也许可以 stub/mock 东西,但很少值得这样做。
至于在 NUnit 中使用连接字符串(以便从您的测试项目中操作数据库),我认为通常没有任何问题,它比您想象的更常见。
测试 DAO 包括 3 个不同的步骤。
1) 测试 POJO(单元测试)
2) 通过(集成测试)测试 DAO
3) 测试 DAO 用户 classes.
1) 正在测试 POJO:
这个非常简单,与 DAO 测试无关。主要是为了增加项目的测试覆盖率,通常测试普通对象的 setter 和吸气剂。
2) 测试 DAO:
这是一个集成测试,它不会增加单元测试的覆盖率。在这种情况下,必须创建 运行 一个测试数据库。之后打开测试数据库会话并添加所有 daoMappers。完成此设置后,dao class 的所有方法都会被调用并一一测试。
3) 测试 DAO 用户 classes:
在单元测试实现中模拟对象是一种非常有用的方法。当您测试一个 class 并且此 class 使用其他服务、方法和 class 时;您可以轻松模拟这些服务、classes 和方法,因为它们可能已经在其他地方进行过测试。通过模拟,我们的意思是假设一个特定的方法 returns 一些特定的值或一个对象。
有很多模拟工具,例如 EasyMock、PowerMockito 和 PowerMock。在 DAO 模拟案例中(因为我们已经在上面测试了 DAO,我们可以模拟它们)我们可以使用 PowerMock 进行模拟。