@TestFor在域的单元测试中做了什么?

时间:2016-12-15 12:00:12

标签: unit-testing grails grails-domain-class

在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时才会抛出异常。我不知道这个领域应该有什么特别之处。它可能只是一个错误吗?

1 个答案:

答案 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