你用的是什么版本的 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
}
}