Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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 如何记录和重用JUnit测试的数据库结果_Java_Database_Testing_Junit - Fatal编程技术网

Java 如何记录和重用JUnit测试的数据库结果

Java 如何记录和重用JUnit测试的数据库结果,java,database,testing,junit,Java,Database,Testing,Junit,我想利用现有数据库作为JUnit测试数据的源。有些场景非常复杂,手动设置所有对象很麻烦 我正在考虑为我现有的DAO设计一个装饰器,它将序列化我真正的SQL连接DAO从数据库返回的对象,并将它们记录到文件中 类似于在记录一次模式下运行JUnit测试用例,然后总是重放记录的数据,而不是进入数据库 是否有Java框架来简化这个过程,或者我必须自己实现它?使用测试数据库。提取要用于测试的数据。用于设置测试数据库。您可以在应用程序和数据库之间设置日志JDBC代理(如、或),以保存返回的查询和结果集。您不必

我想利用现有数据库作为JUnit测试数据的源。有些场景非常复杂,手动设置所有对象很麻烦

我正在考虑为我现有的DAO设计一个装饰器,它将序列化我真正的SQL连接DAO从数据库返回的对象,并将它们记录到文件中

类似于在记录一次模式下运行JUnit测试用例,然后总是重放记录的数据,而不是进入数据库


是否有Java框架来简化这个过程,或者我必须自己实现它?

使用测试数据库。提取要用于测试的数据。用于设置测试数据库。

您可以在应用程序和数据库之间设置日志JDBC代理(如、或),以保存返回的查询和结果集。您不必编写和注入任何DAO装饰程序

稍后,您可以使用记录的数据设置存根数据库连接,以便在测试中使用。JdbcProxy和DbdaTestDriver都有内置函数来实现这一点


[编辑]此项目允许录制JDBC操作,稍后播放:

使用序列化框架(丑陋的内置Java
序列化
API或XML或JSON映射器)将bean转换为文件并返回。许多现代框架只需要很少的提示就可以完成工作

选项:

JSON:或
XML:或

这样,您根本不必进入JDBC。我总是尽量避免测试数据库-供应商应该这样做。我的测试只测试我是否正确使用数据库。为此,我只需要检查查询生成器是否生成正确的SQL字符串(但不需要将它们发送到数据库)

在测试DB(通过JDBC驱动程序向真实对象发送数据)时,测试用例应该尽可能小和简单。我总是针对一个特定的测试数据库运行测试,该数据库包含测试用例,没有生产数据。区别在于测试数据库的每一行都有一个用途。一个生产数据库包含案例A一百万次,案例B一次,案例C缺失,因为它非常罕见

说“我想针对生产数据库的副本进行测试”是一种礼貌的表达方式,“我不知道我在做什么,所以我做了很多。”

当第一个测试运行时,测试数据库将从头开始重建(静态代码块是您的朋友)。这阻止了人们用它做任何事情。每个开发人员都有自己的实例

如果您有一个复杂的存储过程,请像对待任何其他Java代码一样对待它:使用最简单的测试数据测试每个路径


所有这些规则只有两个目标:让每个人在编写针对真实数据库的测试之前三思而后行,然后决定不这样做。第二个目标:如果测试使用数据库,则大多数情况下都会成功。

数据库调用是特定于供应商的存储过程,这使得测试数据库实际上不可行。JdbcProxy看起来是一个不错的解决方案,可惜它似乎被放弃了。找到另一个具有重播功能的解决方案: