Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为数据访问编写单元测试?_Java_Database_Unit Testing - Fatal编程技术网

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

Java 如何为数据访问编写单元测试?,java,database,unit-testing,Java,Database,Unit Testing,单元测试在现代软件开发中变得越来越重要,我发现自己迷失在尘埃中。我主要是一名Java程序员,了解单元测试的基础知识:在应用程序中有测试基本操作的方法。我可以在简单(经常用作示例)的情况下实现这一点: 让我困惑的是如何将其应用到实际应用中。毕竟,大多数简单函数已经存在于API或JDK中。我在工作中经常遇到的一种现实情况是数据访问,即编写DAO来处理数据库。我不能像上面的例子那样编写静态测试,因为从Oracle box中提取一个记录集可以返回一整套内容。编写一个只在返回集中查找特定模式的通用单元测试

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

让我困惑的是如何将其应用到实际应用中。毕竟,大多数简单函数已经存在于API或JDK中。我在工作中经常遇到的一种现实情况是数据访问,即编写DAO来处理数据库。我不能像上面的例子那样编写静态测试,因为从Oracle box中提取一个记录集可以返回一整套内容。编写一个只在返回集中查找特定模式的通用单元测试似乎过于宽泛,毫无帮助。相反,我不编写单元测试。这很糟糕

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


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

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

  • 将数据库设置为已知状态,适用于测试
  • 调用DAO方法
  • 验证DAO是否按预期返回正确的数据和/或更改数据库的状态
无耻插头:是做第一部分的好工具。但是还有其他工具,比如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

我投票结束这个问题,因为它可能是重复的来解释我投票的原因:你可能会得到更好的答案,这个答案更适合关于开发方法、qa和测试的概念性问题(见:)我犹豫是否将它发布在那里,但是,因为我在寻找一个特定于Java的答案(最好),所以我决定选择这里。啊,太遗憾了。我或多或少是将现代编程实践引入工作团队的先锋,而不得不使用比jUnit更复杂的东西对我的工作毫无帮助。(是的,我知道这有多可怕。)JUnit完全能够执行这样的测试,尽管它的名字叫JUnit。Java代码就是Java代码。Java代码是添加还是访问数据库都不会改变任何事情。我使用JUnit,大多数人都使用JUnit(或者使用TestNG)来编写这样的测试。“集成”测试的意思是,测试不仅涉及单个代码单元,还涉及该代码所使用的数据库。
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