通过grails域类中的构造函数设置groovy getter / setter方法

时间:2012-05-20 19:46:21

标签: grails groovy constructor javabeans

我有一个grails单元测试,其代码类似于下面的内容,看起来通过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中的方法设置字段?

2 个答案:

答案 0 :(得分:3)

你使用的是什么版本的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工作。我将getter的方法签名更改为String,将setter更改为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
    }
}

答案 1 :(得分:0)

这是由because引起的 请参阅'bindable'here