我有一个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中的方法设置字段?
答案 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)