在Grails 3中为某些类编写单元测试时,我可以使用@TestFor
注释来指定我要测试的类。在我的单元测试中,我有一个字段" controller"如果我的测试类是一个控制器和一个字段" service"如果我正在测试服务,我可以将这些字段用作测试中的"系统。
我想知道@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:无法转换对象'类MyDomain'与class' java.lang.Class'上课' MyDomain'
这可能意味着Grails尝试使用表示MyDomain类的对象作为此类的实例。我想知道为什么会发生这种情况以及代码有什么问题?我的意思是,domain
属性存在,它出于某种原因,或者它没有?如何在仅访问它时使用抛出异常的属性?
更新
显然,仅当域类中包含字段String name
时才会抛出异常。我不知道这个领域应该有什么特别之处。它可能只是一个错误吗?
答案 0 :(得分:2)
@TestFor
注释为Grails域类做了许多事情,但最重要的是它嘲笑了域的行为和GORM功能,并提供了一个返回域类实例的getter。
域类被注册为原型Spring bean,因此getter只是向应用程序上下文询问新实例,然后将该实例设置为私有$domain
字段,该字段在后续调用getter时返回。请注意,您的def doesntMatter = domain
正在使用此生成的getter,相当于def doesntMatter = 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。