在两个类似的Grails 3.3.5测试案例中,我观察到了不同的行为。两种情况之间的区别是:
objects1
和objects2
中。在规范中修改对象后,更改将同时应用于objects1
和objects2
。objects1
)交付对象,然后在规范中修改该对象时,所做的更改仅应用于objects1
,而不适用于其他集合{{1 }}。我的问题是:根据Java和Groovy的面向对象范例,我希望两个测试的行为都像第一个测试一样。为什么会有差异,取决于创建对象的类是什么?
为澄清起见,我的代码示例如下。域类:
objects2
控制器类:
class MyTestObject {
String value
static constraints = {
}
MyTestObject(){
value = "initialized"
}
void edit(){
value = "edited"
}
String getValue(){
value
}
}
规范是:
class MyTestController {
def index() { }
Map<Integer, MyTestObject> objects1
Map<Integer, MyTestObject> objects2
MyTestController(){
objects1 = new HashMap<>()
objects2 = new HashMap<>()
}
void addObject(){
int count = objects1.size()
objects1.put(count, new MyTestObject())
objects2.put(count, new MyTestObject())
}
void addObject(MyTestObject testObject){
int count = objects1.size()
objects1.put(count, testObject)
objects2.put(count, testObject)
}
MyTestObject getObjectFromCollection1(int atPosition){
if (0 > atPosition || atPosition > objects1.size()-1){
return
}
objects1.get(atPosition)
}
MyTestObject getObjectFromCollection2(int atPosition){
if (0 > atPosition || atPosition > objects2.size()-1){
return
}
objects2.get(atPosition)
}
void updateObjectInCollection1(int index, MyTestObject object){
objects1.put(index, object)
}
}
答案 0 :(得分:1)
为什么会有区别,具体取决于哪个类正在创建 对象?
根据哪个类创建对象没有区别。该问题与实例的创建位置无关。问题在于,在addObject()
中您将创建2个单独的对象,将其中一个添加到objects1
,将另一个添加到objects2
。在addObject(MyTestObject)
中,您要向两个MyTestObject
的每一个中添加相同的Map
实例。
void addObject(){
int count = objects1.size()
objects1.put(count, new MyTestObject())
objects2.put(count, new MyTestObject())
}
void addObject(MyTestObject testObject){
int count = objects1.size()
objects1.put(count, testObject)
objects2.put(count, testObject)
}
如果您将addObject()
更改为如下所示,您的测试将通过:
void addObject(){
int count = objects1.size()
def newTestObject = new MyTestObject()
objects1.put(count, newTestObject)
objects2.put(count, newTestObject)
}