unit-testing - @TestFor 在域的单元测试中做什么?

标签 unit-testing grails grails-domain-class

在 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/

相关文章:

Grails 应用程序中的 Hibernate 二级缓存

Grails transient 属性未在对象创建时获取

grails - 如何在 Grails 中实现自引用关系?

unit-testing - Karma+jasmine+Angular2 单元测试 http 服务错误(没有 [object Object] 提供者)

php - 运行 phpunit 时未找到 fatal error 'File/Iterator/Autoload.php'

python - 在Django中,如何将manage.py测试的结果放入文件中?

jquery - 从Ajax调用获取数据,而不是字符串

grails - 如何在grails中调用函数

Grails + GORM : What is the default equals() implementation in GORM?

c# - 单元测试;正确的做法?