Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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_Web Services_Junit - Fatal编程技术网

Java 使用模拟数据库进行JUnit测试

Java 使用模拟数据库进行JUnit测试,java,database,web-services,junit,Java,Database,Web Services,Junit,我正在开发一个测试不同Web服务的应用程序,我希望它尽可能通用。我需要填充数据库来进行JUnit测试,但我不希望提交这些更改。 我知道一些内存中的数据库(如HSQL DB)允许在某种虚拟(或模拟)数据库上进行测试,但不幸的是,我使用oracle,由于数据表结构复杂,现在无法更改它 你建议的最佳实践是什么? 谢谢。首先,HSQL和Hibernate没有任何关系。问题是,您是否可以找到一个嵌入式数据库,该数据库支持与生产数据库相同的SQL(或者您的应用程序使用的SQL子集) 这是一个很好的选择,因为

我正在开发一个测试不同Web服务的应用程序,我希望它尽可能通用。我需要填充数据库来进行JUnit测试,但我不希望提交这些更改。 我知道一些内存中的数据库(如HSQL DB)允许在某种虚拟(或模拟)数据库上进行测试,但不幸的是,我使用oracle,由于数据表结构复杂,现在无法更改它

你建议的最佳实践是什么?
谢谢。

首先,HSQL和Hibernate没有任何关系。问题是,您是否可以找到一个嵌入式数据库,该数据库支持与生产数据库相同的SQL(或者您的应用程序使用的SQL子集)

这是一个很好的选择,因为它模拟了许多不同的SQL风格

最重要的是:不要测试数据库。假设您的供应商对数据库进行了彻底的测试,并且数据库正常工作

在我的代码中,我的目标是:

  • 保存并加载每个实体

  • 为我使用的所有查询生成SQL,并将它们与测试中的字符串文本进行比较(即,我不会一直对数据库运行查询)

  • 有些测试查找系统属性。如果设置了,那么他们将对数据库运行查询。这发生在我的CI服务器上的夜间

  • 其基本原理是:只要DB模式不变,就没有必要实际运行查询。这意味着白天我坐在电脑前运行它们是一种巨大的时间浪费

    为了确保“低影响”的更改不会从间隙中溜走,我让计算机在我不在乎的时候运行它们

    同样,我有许多DAO的模拟,它们返回各种预定义的结果,因此我不必查询数据库。这里的基本原理是,我想测试来自数据库的结果处理,而不是JDBCAPI、DB驱动程序、操作系统的TCP/IP堆栈、网络硬件(和软件)或我的代码与某个硬盘上的数据库记录之间的任何其他1000项


    更多详细信息请参见我的博客:

    但我认为在H2中导入复杂的oracle数据库模式会很困难,难道没有其他替代方案吗?如果你想做这样的事情,无论如何都要付出高昂的代价。要么您需要一种从单元测试创建Oracle实例的方法,要么您需要刷新数据库并加载它(这要容易一点),要么您需要遵循我的方法。