Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate 域类的自动测试(非单元测试)_Hibernate_Unit Testing - Fatal编程技术网

Hibernate 域类的自动测试(非单元测试)

Hibernate 域类的自动测试(非单元测试),hibernate,unit-testing,Hibernate,Unit Testing,当前问题 请参阅相关帖子: 在我的新J2EE项目中,我正在尝试测试(不一定是单元测试)我已经开始编写的域对象。它们不涉及太多的业务逻辑(业务逻辑是DAO对象之上的业务服务的一部分),通过测试,我基本上确保了域对象的完整性,我尝试通过测试DAO方法来做到这一点。请注意,我无法使用JUnit等测试域对象,因为在我的示例中,它们没有任何方法,并且具有属性和hibernate映射注释 例如,让我考虑病人域对象。在本例中,PatientDAO正在处理Patient域对象的CRUD操作。下面是一些方法(不完

当前问题

请参阅相关帖子: 在我的新J2EE项目中,我正在尝试测试(不一定是单元测试)我已经开始编写的域对象。它们不涉及太多的业务逻辑(业务逻辑是DAO对象之上的业务服务的一部分),通过测试,我基本上确保了域对象的完整性,我尝试通过测试DAO方法来做到这一点。请注意,我无法使用JUnit等测试域对象,因为在我的示例中,它们没有任何方法,并且具有属性和hibernate映射注释

例如,让我考虑病人域对象。在本例中,PatientDAO正在处理Patient域对象的CRUD操作。下面是一些方法(不完整,打算稍后添加更多的方法来测试边界条件)

注意:我不是把它们称为单元测试用例,它们可能是小型集成测试等。我很高兴这种方法可以在测试域对象时起作用

PatientDAOTest类包含: -testCreatePatient(); -testUpdatePatient(); -testFindPatient(); -testdelete患者()

PatientDAO类包含: -createPatient(); -updatePatient(); -findPatient(); -删除患者()

让我们考虑在域对象中测试UpDATEMETHODE()的TeStudiDePATIAN()方法。现在,我将如何实现testUpdatePatient()方法?我的想法是: 1.使用“findPatient()”域方法获取现有患者 2.使用新的详细信息更新病历 3.使用“updatePatient()”域方法将其保存回数据库 4.使用“findPatient()”域方法从数据库检索病历 5.为更新的数据断言

问题

正如您所看到的,我在测试中使用了数据库,对此我很满意,但是这种方法有什么问题吗

关于这种方法,我真正的问题是什么

在测试'updatePatient()'时,我需要使用'findPatient()'方法(实际上是2次)。这就是我不喜欢的,在测试一个方法时我必须使用另一个方法,而另一个方法本身可能有缺陷。当我尝试测试其他CRUD方法时,同样的故事也会重复

或者,我可以编写select sql查询,从数据库中获取病历,以便从测试方法中进行断言(在触发更新后),但它完全违背了使用hibernate的目的(以减少sql编码工作量),因此,我不喜欢这种方法

我的问题是,通常依赖其他方法来测试特定的方法,这是一种不错的方法吗?如果这是错误的,我应该如何在我的域对象中测试ORM映射呢


感谢您的评论和对如此冗长的帖子表示歉意。

根据我的经验,您主要关注的问题的答案很简单,但这里还有几个其他概念性问题

  • 在另一个特性(updatePatient)的IDE测试中包含使用特性(findPatient)是完全可以的,但前提是您有另一个测试,该测试仅涵盖findPatient本身
  • <> LI>对于DB集成测试的方法性部分,您可以考虑使用DeItACED AutoTestDB,清除所有数据并将其初始化为所需状态作为单元测试的设置。使用纯SQL脚本使用示例初始数据初始化数据库(截断表患者;插入患者…)-我以前做的是在几个命名的数据库初始数据状态之间切换(例如,“cleanDB”、“twoPatientsSimple1”、“twoPatientsLenkedToInsuranceContracts1”等)。这里的要点是,您的DB在单元测试期间会发生更改,并且使用纯回滚进入测试之前的状态无法确保您想要的确切状态(例如,您可能会在测试期间明确提交,并且您的数据会进入非初始状态)。您还可以包括测试,以确保在测试更改DB状态后,使用纯SQL来确保DB状态。使用这种方法进行测试通常执行速度慢,维护难度大(除非您有一套我们自己的助手工具),但它会让您对数据和行为充满信心。在您清楚地做到这一点之后,它可以在UI/功能测试期间为您节省大量的时间和混乱。这听起来很可怕,但是当你稍微使用它时,你最终会得到一组简单的DB状态数据(例如,在测试用例中表示为TSV/CSV)“initState”和“expectedState”,你只需使用这些状态在测试行为之前/之后进行初始化/比较
  • 对于域对象的真正单元测试(未与DB集成),您必须模拟DAO/Repository/DataMapper类,例如使用简单的列表泛型(createPatient将其添加到列表中等)
  • 对于ORM本身(您自己的、第三方或您的扩展)的集成测试,您可以使用第2点中的方法对一些样本数据(不一定是您的域对象)进行测试,这些数据足够复杂,可以让您对ORM的工作方式有信心。例如,Microsoft Entity Framework在早期阶段的工作非常不可预测,因此编写您通常使用的功能的完整集成测试可以避免调试ORM本身的错误和问题,并向您展示ORM在各种条件下的行为