在 Grails 3 中为某个类编写单元测试时,我可以使用 @TestFor
注释来指定我要测试的类。在我的单元测试中,如果我的被测类是 Controller ,则我有一个字段“ Controller ”;如果我正在测试服务,则有一个字段“服务”,并且我可以使用这些字段作为“被测系统”。
我想知道 @TestFor
在域类测试中正在做什么以及应该如何使用它。我找不到任何涉及此案例的文档。假设我有一个域“MyDomain”和一个测试“MyDomainSpec”,其开头如下:
@TestFor(MyDomain)
class MyDomainSpec extends Specification {
def setup() {
def doesntMatter = domain // just to check access to "domain"
最后一行已经给了我一个
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'class MyDomain' with class 'java.lang.Class' to class 'MyDomain'
这可能意味着 Grails 尝试使用表示 MyDomain 类的对象作为此类的实例。我想知道为什么会发生这种情况以及代码有什么问题?我的意思是,domain
属性存在,并且它存在是有原因的,或者不是?如何使用仅在访问时抛出异常的属性?
更新
显然,只有当域类中有一个字段String name
时才会抛出异常。我不知道这个领域有什么特别之处。难道这只是一个错误吗?
最佳答案
@TestFor 注释为 Grails 域类做了很多事情,但最重要的是它模拟了域的行为和 GORM 功能,并提供了一个返回域类实例的 getter .
域类被注册为原型(prototype) Spring bean,因此 getter 只是向应用程序上下文请求一个新实例,然后将该实例设置到一个私有(private) $domain
字段中,该字段在后续调用时返回 setter/getter 。请注意,您的 def isntMatter = domain
正在使用此生成的 getter,并且相当于 def isntMatter = getDomain()
,其中 getDomain()
返回一个新的MyDomain
的实例。
听起来你的假设是正确的。调用 getter 不应导致异常。以下工作正常:
@TestFor(MyDomain)
class MyDomainSpec extends Specification {
void "a new domain can be saved"() {
given: "a new instance of MyDomain"
def d = domain // or getDomain()
expect:
d.id == null
when:
d.save()
then:
d.id != null
}
}
@Entity
class MyDomain {
}
编辑: 这与 Grails 中的错误有关,应该在下一版本中修复,请参阅 https://github.com/grails/grails-core/issues/10363 .
关于unit-testing - @TestFor 在域的单元测试中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41163680/