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")

グルーヴィーなコンストラクターのメソッドを介してフィールドを設定する方法はありますか?

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 を機能させるには、メソッド シグネチャをより明確にする必要があります。Stringgetterと 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 に答える