集合中的Grails实例修改

时间:2018-10-30 12:35:30

标签: java unit-testing grails

在两个类似的Grails 3.3.5测试案例中,我观察到了不同的行为。两种情况之间的区别是:

  • 在第一个测试用例中,规范创建一个测试对象,并将其交给控制器,该控制器将其添加/放置到他的两个集合objects1objects2中。在规范中修改对象后,更改将同时应用于objects1objects2
  • 在第二个测试用例中,控制器本身创建一个对象并将其放入他的两个集合中。当我要求控制器从第一个集合(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)
    }

}

1 个答案:

答案 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)
}