どのバージョンの 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
getterと 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
}
}