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

标签 java database unit-testing

单元测试在现代软件开发中变得越来越重要,而我发现自己迷失在灰尘中。我主要是一名 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 框中提取记录集可能会返回一整套内容。编写一个仅在返回集中查找特定模式的通用单元测试似乎过于宽泛且无益。相反,我不编写单元测试。这很糟糕。

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

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

最佳答案

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

  • 将数据库设置为已知状态,适合测试
  • 调用 DAO 方法
  • 验证 DAO 是否返回正确的数据和/或按预期更改数据库状态。

无耻插件: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

关于java - 如何编写数据访问的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265755/

相关文章:

c++ - 如何在 cppunit 中断言语句抛出 Excp1 或 Excp2 类型的异常?

c++ - 如何使用 QTest QBENCHMARK 宏结果作为单元测试中的参数

javascript - Sinon js 调用 PUT 或 POST 方法

java - 导入 com.amazonaws.services.dynamodbv2.document.DynamoDB;无法解析导入的文档部分

java - JVM 上的 2d 多媒体库

regex - 如何在 Mongodb 上进行不区分大小写的查询?

java - 有什么方法可以从本地计算机(本地服务器)读取数据库文件并将其复制到android中的 Assets 文件夹中?

mysql - 在插入新行之前删除行

java - 使用 java mail api 在邮件服务器上更快地搜索特定邮件

java - 如何在子类中访问父类(super class)的 ‘protected static’ 变量,子类位于不同的包中..?