2016-12-15 11 views
1

当为Grails 3中的某个类编写单元测试时,我可以使用@TestFor注释来指定我想测试的类。在我的单元测试中,如果我的测试服务是一个控制器和一个字段“服务”,并且我可以使用这些字段作为“测试中的系统”,那么我有一个字段“控制器”。@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中的“投对象类MYDOMAIN'上课“MYDOMAIN”

这可能意味着Grails的尝试使用表示MYDOMAIN类为这个类的一个实例的对象。我想知道为什么会发生这种情况,代码有什么问题?我的意思是,domain属性存在,它确实是有原因的,不是吗?我怎样才能使用仅仅访问它时抛出异常的属性?

更新
显然引发异常只有在域类中有一个字段String name。我不知道这个领域应该如此特别。它可能只是一个错误?

+0

这似乎是一个有用的文章。他们在域类上使用'@ TestFor' http://www.christianoestreich.com/2012/11/domain-constraints-grails-spock-updated/ – zero01alpha

+1

@ zero01alpha这是一个有趣的阅读本身,谢谢。但是关于TestFor,他们只提到它使得方法“mockForConstraintsTests”可用。 – Matthias

回答

2

@TestFor批注为Grails域类做了很多事情,但最重要的是它嘲弄了域的行为和GORM功能,并提供了一个返回域类的实例的getter。

域类被注册为原型的Spring beans,所以吸气只是要求一个新实例的应用程序上下文,然后设置一个实例到这是对后续调用getter返回的私人$domain场。请注意,您的def doesntMatter = domain正在使用此生成的吸气剂,相当于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

+0

谢谢!你的代码也适用于我。你确定“每次请求时getter只是询问新实例的应用上下文”吗?我的调试器告诉我,否则 - 我得到相同的实例连续用于域或getDomain。关于CastException:显然,当MyDomain中有一个字段“String name”时会发生这种情况。奇怪... – Matthias

+0

对不起,我的错。如果私有'$ domain'字段不为空,那么getter只会从应用程序上下文中请求一个新实例。所以你会得到相同的实例,除非你明确设置了'$ domain = null'。 – dpcasady

+0

好的我也看到'GroovyCastException'和'String name'。我会试着找出原因。 – dpcasady

相关问题