3

我有一个 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 构造函数中的方法设置字段?

4

2 回答 2

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 正常工作。我将 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
    }
}
于 2012-05-20T23:23:59.770 回答
1

这是因为在此处 查看“可绑定”

于 2012-08-18T12:52:13.777 回答