【问题标题】:What does @TestFor do in a unit test for a domain?@TestFor 在域的单元测试中做了什么?
【发布时间】:2016-12-15 12:00:12
【问题描述】:

在为 Grails 3 中的某个类编写单元测试时,我可以使用 @TestFor 注释来指定我要测试的类。在我的单元测试中,如果我的被测类是控制器,则我有一个字段“控制器”,如果我正在测试服务,则有一个字段“服务”,我可以将这些字段用作“被测系统”。

我想知道@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:无法将具有类“java.lang.Class”的对象“class MyDomain”转换为类“MyDomain”

这可能意味着 Grails 尝试使用表示 MyDomain 类的对象作为此类的实例。我想知道为什么会发生这种情况以及代码有什么问题?我的意思是,domainproperty 存在,它确实是有原因的,或者不是吗?如何使用仅在访问时引发异常的属性?

更新
显然,只有当域类中有一个字段 String name 时才会引发异常。我不知道这个领域有什么特别之处。会不会只是一个错误?

【问题讨论】:

  • 这似乎是一篇有用的文章。他们在域类 christianoestreich.com/2012/11/… 上使用 @TestFor
  • @zero01alpha 这本身就很有趣,谢谢。但关于 TestFor,他们只提到它使“mockForConstraintsTests”方法可用。

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


【解决方案1】:

@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

【讨论】:

  • 谢谢!你的代码也适用于我。您确定“每次请求时,getter 都会向应用程序上下文询问新实例”吗?否则,我的调试器会告诉我——我会为连续使用域或 getDomain 获得相同的实例。关于 CastException:显然它发生在 MyDomain 中有一个字段“字符串名称”时。奇怪...
  • 对不起,我的错误。如果私有 $domain 字段不为空,getter 只会从应用程序上下文中请求一个新实例。因此,除非您明确设置 $domain = null,否则您将获得相同的实例。
  • 好吧,我也看到了GroovyCastExceptionString name。我会试着找出原因。
  • 这是 Grails 中的一个错误,应该在下一个版本中修复,请参阅 github.com/grails/grails-core/issues/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多