2012-05-20 29 views
2

我有一个类似于下面的代码的grails单元测试,并且似乎通过getter/setter方法设置字段不能与构造函数一起工作(尽管它实际上起作用与非域类)。在grails域类中通过构造函数设置groovy getter/setter方法

据我所知,与性能以下工作:

class Person { 
    def firstName 
    def lastName 

    def getFullName() { 
    return "$firstName $lastName" 
    } 

    def setFullName(name) { 
    firstName = name.split(" ")[0] 
    lastName = name.split(" ")[1] 
    } 
} 

def = new Person(fisrtName: "Joe", lastName: "Bloggs") 

但是当我做了以下的姓氏和名字字段不被置:

def = new Person(fullName: "Joe Bloggs") 

有没有一种办法通过groovy contstructor中的方法设置字段?

回答

3

你使用的是什么版本的groovy?这对我来说工作正常使用Groovy 1.8.6,我认为它是这样工作了很长一段时间:

class Person { 
    def firstName 
    def lastName 

    def getFullName() { 
    return "$firstName $lastName" 
    } 

    def setFullName(name) { 
    firstName = name.split(" ")[0] 
    lastName = name.split(" ")[1] 
    } 
} 

def p1 = new Person(firstName: "Joe", lastName: "Bloggs") 
def p2 = new Person(fullName: "Joe Bloggs") 

assert p1.firstName == p2.firstName 
assert p1.lastName == p2.lastName 

更新时间:

只是尝试这样做对Grails的2.0.3。您需要在方法签名中更加明确地使用grails工作。我将吸气剂的方法签名更改为String,并将设定器更改为void,并使用该方法。它只适用于def。 Grails 2对匹配签名的要求比以前版本的Grails更严格,我敢打赌这是它的一部分。

此外,您应该指定fullName“属性”是暂时的,因为它不是一个应该保留在数据库中的实际属性。下面是在Grails的2.0.3为我工作的领域和测试类:

Person.groovy:

package com.example 

class Person { 
    String firstName 
    String lastName 

    static transients = ["fullName"] 

    String getFullName() { 
     return "$firstName $lastName" 
    } 

    void setFullName(String name) { 
     firstName = name.split(" ")[0] 
     lastName = name.split(" ")[1] 
    } 
} 

PersonTests.groovy:

package com.example 



import grails.test.mixin.* 
import org.junit.* 

/** 
* See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 
*/ 
@TestFor(Person) 
@Mock([Person]) 
class PersonTests { 

    void testFullName() { 
     Person p1 = new Person(firstName: "Joe", lastName: "Bloggs").save(failOnError: true) 
     Person p2 = new Person(fullName: "Joe Bloggs").save(failOnError: true) 

     assert p1.firstName == p2.firstName 
     assert p1.lastName == p2.lastName 
     assert p1.fullName == p2.fullName 
    } 
} 
+0

作为grails域模型? –

+0

你是对的。这在groovy中起作用,我认为它失败的地方是Grails框架。 –

0

这是由because 参见“引起的可绑定'here

+1

虽然这可能在理论上回答这个问题,[这将是更可取的](http://meta.stackexchange.com/q/8259)在这里包括答案的基本部分,并提供链接供参考。 –

相关问题