gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:20:11 25 4
gpt4 key购买 nike

设置一些集成测试后,我遇到了域类相等性的问题。相等性在正常执行期间按预期工作,但是当通过集成测试测试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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com