Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 使用Hibernate时集成测试本机SQL查询_Java_Hibernate_Unit Testing_Orm_Integration Testing - Fatal编程技术网

Java 使用Hibernate时集成测试本机SQL查询

Java 使用Hibernate时集成测试本机SQL查询,java,hibernate,unit-testing,orm,integration-testing,Java,Hibernate,Unit Testing,Orm,Integration Testing,我使用Hibernate和广泛采用的Hibernate查询语言在DAO中定义查询 无论如何,与本机SQL查询相比,HQL有时无法执行特定的任务 例如,以下Postgres表达式不能“转换”为HQL: 这意味着在某些情况下,我正在编写本机查询。考虑到我正在使用另一个数据库进行集成测试(),它没有反映上述Postgres表达式的语法。这导致在使用这种本机查询的DAO方法期间出现测试异常 你如何处理这些案件?我可以想象以下情景: 永远不要使用本机查询并尝试在HQL中构建所有内容(可能吗?) 不要测试

我使用Hibernate和广泛采用的Hibernate查询语言在DAO中定义查询

无论如何,与本机SQL查询相比,HQL有时无法执行特定的任务

例如,以下Postgres表达式不能“转换”为HQL:

这意味着在某些情况下,我正在编写本机查询。考虑到我正在使用另一个数据库进行集成测试(),它没有反映上述Postgres表达式的语法。这导致在使用这种本机查询的DAO方法期间出现测试异常

你如何处理这些案件?我可以想象以下情景:

  • 永远不要使用本机查询并尝试在HQL中构建所有内容(可能吗?)
  • 不要测试使用此类查询的方法(不满意)
  • 在生产和开发中使用相同的数据库(性能问题)

其他更有趣的解决方案?感谢

通常,集成测试的目的是针对(非常)类似于生产的环境进行测试,因此在我看来,您应该使用相同的数据库引擎。但是对于单元测试,使用HSQLDB是可以的。不幸的是,在这种情况下,对Postgres具有依赖性的类无法进行单元测试,您必须等到集成测试后才能检测bug

但另一方面,您提到的PostgresSQL的结果可以通过在Java上执行日期算法来实现

Calendar currentDateCal = Calendar.getInstance();
currentDateCal.add(Calendar.YEAR, -10);
Date currentDate = currentDateCal.getTime(); // bind this currentDate object into your HQL parameter

通常,集成测试的目的是针对(非常)类似于生产环境的环境进行测试,因此您应该使用相同的数据库引擎。但是对于单元测试,使用HSQLDB是可以的。不幸的是,在这种情况下,对Postgres具有依赖性的类无法进行单元测试,您必须等到集成测试后才能检测bug

但另一方面,您提到的PostgresSQL的结果可以通过在Java上执行日期算法来实现

Calendar currentDateCal = Calendar.getInstance();
currentDateCal.add(Calendar.YEAR, -10);
Date currentDate = currentDateCal.getTime(); // bind this currentDate object into your HQL parameter

您正在使用另一个数据库进行单元测试?我认为您误解了单元测试的目的。你根本不应该访问数据库。当您开始访问数据库时,您现在正在使用集成测试。单元测试旨在覆盖一个特定的代码单元(通常是一个类),并且应该模拟该类可能具有的任何和所有外部依赖关系。@ColinMorelli那么如何在单元测试中测试DAO呢?如何模拟数据库?可能一种解决方案是扩展一些hibernate/jpa类(例如EntityManager),在将SQL发送到HSQLDB之前对其进行修改。@Wizche我认为您没有抓住要点。如果您将单元测试和集成测试分开,那么您的问题就得到了回答。单元测试不会与数据库通信。集成测试绝对应该与生产环境的副本对话。因此,您只需与开发PostgreSQL数据库进行交谈。那么你的问题就完全避免了。使用不同的系统在不同的环境中进行测试在某种程度上违背了测试的目的。您应该始终以模拟生产为目标。@Wizche否,您应该使用生产架构的精确副本(不含数据)。集成测试应该插入任何需要插入的测试数据,然后进行DAO调用以确保返回正确的数据。在任何一种情况下,您都应该查询Postgres,因为这是您在生产中所拥有的,您正在使用另一个数据库进行单元测试吗?我认为您误解了单元测试的目的。你根本不应该访问数据库。当您开始访问数据库时,您现在正在使用集成测试。单元测试旨在覆盖一个特定的代码单元(通常是一个类),并且应该模拟该类可能具有的任何和所有外部依赖关系。@ColinMorelli那么如何在单元测试中测试DAO呢?如何模拟数据库?可能一种解决方案是扩展一些hibernate/jpa类(例如EntityManager),在将SQL发送到HSQLDB之前对其进行修改。@Wizche我认为您没有抓住要点。如果您将单元测试和集成测试分开,那么您的问题就得到了回答。单元测试不会与数据库通信。集成测试绝对应该与生产环境的副本对话。因此,您只需与开发PostgreSQL数据库进行交谈。那么你的问题就完全避免了。使用不同的系统在不同的环境中进行测试在某种程度上违背了测试的目的。您应该始终以模拟生产为目标。@Wizche否,您应该使用生产架构的精确副本(不含数据)。集成测试应该插入任何需要插入的测试数据,然后进行DAO调用以确保返回正确的数据。在任何一种情况下,您都应该查询Postgres,因为这是您在产品中所拥有的。在单元测试中,您根本不应该与数据库对话,它应该测试代码的特定部分,而没有外部依赖关系。感谢gerry,尽管许多人完全反对使用不同的数据库进行“任何”测试,我认为你是对的,如果我对数据库语法有依赖性,我可以使用相同的数据库,也可以修改查询。在单元测试中,你根本不应该与数据库对话,它应该在没有外部依赖性的情况下测试代码的特定部分。谢谢gerry,尽管许多人完全反对使用不同的数据库进行“whatever”测试,但我认为你是对的,如果我依赖于数据库语法,我可以使用相同的数据库或修改查询。