如何编写数据访问的单元测试?

How to write unit tests for data access?

单元测试在现代软件开发中变得越来越重要,而我发现自己迷失在尘埃中。作为一名 Java 程序员,我了解单元测试的基础知识:拥有适当的方法来测试应用程序中的基本操作。我可以为简单的(并且经常用作示例)案例实现这个:

public boolean addNumbers(int a, intb) {return a + b;}
//Unit test for above
public boolean testAddNumbers() {return addNumbers(5, 10) == 15;}

令我困惑的是如何将其付诸实际应用。毕竟,大多数简单的功能已经在 API 或 JDK 中。我在工作中经常遇到的真实情况是数据访问,即编写 DAO 来处理数据库。我不能像上面的例子那样编写静态测试,因为从 Oracle 盒子中提取记录集可以 return 各种各样的事情。编写仅在 return 集中查找特定模式的通用单元测试似乎过于宽泛且无益。相反,我不编写单元测试。这很糟糕。

Web 应用程序是我不知道如何编写测试的另一个例子。我的 Web 应用程序通常构建在 J2EE 堆栈上,但它们不涉及太多逻辑。通常,它从数据库中传递信息,几乎不需要任何操作。这些单元测试的目标不合适吗?

简而言之,我发现绝大多数单元测试示例都集中在过于简单且与我的工作无关的测试用例上。我正在寻找任何(最好是 Java)examples/tips 为移动和显示数据的应用程序编写单元测试,而不是对其执行逻辑。

你通常不会为 DAO 编写单元测试,而是集成测试。这些测试基本上包括

  • 设置数据库为熟知状态,适合测试
  • 调用DAO方法
  • 验证 DAO returns 正确的数据 and/or 是否按预期更改了数据库的状态。

无耻插件:DbSetup是做第一部分的好工具。但是还有其他工具,例如 DBUnit。

要测试应用程序的业务逻辑(复杂与否,变化不大),您通常使用像 Mockito 这样的模拟框架来模拟 DAO:

SomeDao mockDao = mock(SomeDao.class);
when(mockDao.findAllEmployees()).thenReturn(Arrays.asList(e1, e2, e3));
SomeService service = new SomeService(mockDao);
someService.increaseSalaryOfAllEmployeees(1000);
// todo verify that e1, e2 and e3's salary is 1000 larger than before