grails - Grails集成测试-域对象相等

标签 grails integration-testing grails-domain-class

设置一些集成测试后,我遇到了域类相等性的问题。相等性在正常执行期间按预期工作,但是当通过集成测试测试Service方法时,相等性测试将返回false。

一种服务(在测试用例的setUp()中调用)将Domain对象放入 session 中

SomeService {
  setSessionVehicle(String name) {
    Vehicle vehicle = Vehicle.findByName(name)
    session.setAttribute("SessionVehicle", vehicle)
  }

  getSessionVehicle() {
    return session.getAttribute("SessionVehicle")
  }
}

在其他服务的其他地方,我加载了一个对象,并确保关联的属性对象与 session 值匹配:
OtherService {
  getEngine(long id) {
    Vehicle current = session.getAttribute("SessionVehicle")

    Engine engine = Engine.get(id)
    if(!engine.vehicle.equals(current)) throw Exception("Blah blah")
  }
}

在正常运行期间,这可以按预期工作,从而防止加载错误的引擎(好吧,我已经清理了类名,假装这样做很有意义)。但是在集成测试中,.equals()应该成功时会失败:
Vehicle testVehicle

setUp() {
  Vehicle v = new Vehicle("Default")
  v.save()
  someService.setSessionVehicle("Default")
  testVehicle = someService.getSessionVehicle()
}

testGetEngine() {
  List<Engine> engines = Engine.findAllByVehicle(testVehicle)
  //some assertions and checks
  Engine e = otherService.getEngine(engines.get(0).id)
}
findAll()调用正确返回了 session 中与车辆关联的所有引擎的列表,但是当我尝试通过ID查找单个引擎时,对找到的引擎上的 session 与车辆进行相等性检查失败。此时仅创建了单个车辆,并且“异常”消息显示 session Vehicle和Engine.Vehicle存在并且具有相同的值。

如果我尝试在testCase本身中进行此相等性检查,它将失败,但是我可以更改testCase以检查成功的if(vehicle.id == sessionVehicle.id),但我不希望更改生产代码以满足集成测试的要求。

在测试用例中设置这些域对象时,我应该做些不同的事情吗?

最佳答案

首先,您正在执行的相等性检查只是检查引用。您不应该使用默认的equals方法进行检查,最好覆盖域类中的equals方法。
有两种方法可以覆盖equals方法:
1)您可以使用您的IDE自动为equals方法生成代码(很多null检查等。)。
2)首选方式:您可以从Apache Commons项目使用EqualsBuilder和HashCodeBuilder类。该库应已可用于您的应用程序,或下载JAR文件并放置在lib中。以下是使用EqualsBuilder的示例代码:

            boolean equals(o) {
               if ( !(o instanceof Vehicle) ) {
                  return false
               }
               def eb = new EqualsBuilder()
               eb.append(id, o.id)
               eb.append(name, o.name)
               eb.append(otherProperties, o.otherProperties)
            ....
               return eb.isEquals()
            }

另一点是:您如何获得服务 session ?从RequestContextHolder吗?最好不要直接从服务访问 session ,而是在服务中将值作为方法参数发送。

关于grails - Grails集成测试-域对象相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16324827/

相关文章:

asp.net-web-api - 我可以将 FlurlClient 与 Asp.Net Core TestServer 一起使用吗?

java - 如何在一次测试中启动2个Spring Boot应用程序?

devise - “Could not find a valid mapping for #<User …>”仅在第二次和连续测试中

grails - Grails GORM通过Domain映射内的值查找

grails - 将基于createBriteria的订单基于基于EmiratesTo属性

grails - 如何在Grails 3.0.2中禁用SolrAutoConfiguration.class

testing - Grails 自定义 taglib 在集成测试期间无法使用自定义工件

javascript - 网站流量跟踪集成

hibernate - 如何不使用flush进行更新:true

grails - groovy.lang.MissingPropertyException