在 Intellij Idea 中运行 grails 2.1.3 测试:Spock 测试中出现奇怪错误:无法添加域类 [class x.y.Z]。它不是域

Posted

技术标签:

【中文标题】在 Intellij Idea 中运行 grails 2.1.3 测试:Spock 测试中出现奇怪错误:无法添加域类 [class x.y.Z]。它不是域【英文标题】:running grails 2.1.3 tests in Intellij Idea: Bizarre error in Spock test: Cannot add Domain class [class x.y.Z]. It is not a Domain 【发布时间】:2013-03-30 05:49:58 【问题描述】:

我正在升级到 grails 2.1.x,需要重做一些旧式测试。

我刚刚在我的 spock 规范中添加了一个新测试,对于这个测试,我需要模拟一个额外的 Domain 类。

在此之前,我有:

@Mock([Event, EventType])

现在我有:

@Mock([Event, EventType, Notification])

Notification.groovy 与 Event 和 EventType 位于相同的包和物理目录中(在 grails-app/domain 下),因此它绝对是一个 grails 域类。

当我尝试运行我的测试时,我得到以下堆栈跟踪:

org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Cannot add Domain class [class x.y.Notification]. It is not a Domain!
    at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:911)
    at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:615)
    at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:131)
    at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:128)

当我通过兔子洞并开始调试执行时,我到达了 DomainClassArtefactHandler 的这一部分(第 87 行):

            // make sure the identify and version field exist
            testClass.getDeclaredField(GrailsDomainClassProperty.IDENTITY);
            testClass.getDeclaredField(GrailsDomainClassProperty.VERSION);

这会出现异常,因为我猜 id 字段不存在

所以出了点问题,在执行之前没有添加 GORM 字段。

有人对我需要做什么有建议吗?我是否需要将我的域类标记为 @Entity(这实际上使我的测试通过)?

我很确定这不应该是我的单元测试通过的强制性要求。

有什么建议吗?

更新: 实际上,我刚刚发现只有在我的 IDE 中运行单元测试时才会出现这个问题:intellij Idea 12.1

已创建问题,此处有测试应用:

http://jira.grails.org/browse/GRAILS-9989

http://youtrack.jetbrains.com/issue/IDEA-105087

当我删除两个域类中的静态映射块时,测试通过了!

【问题讨论】:

这是在集成测试文件夹还是单元测试文件夹?此外,如果您有任何扩展规范并使用 @TestFor 的 spock 集成测试,您会遇到非常奇怪的错误,您仍然需要使用集成规范进行集成测试。 嗨,杰夫,这是一个单元测试。集成文件夹中还没有规范,只有 junit 样式测试。不过感谢您的关注,我会记住这一点。 对于那个域对象是否有静态映射块? 是的,有一个静态映射块!! 剧情变厚:我添加了更新 【参考方案1】:

问题似乎是由于 IDEA 没有正确清理从一次测试运行到另一次运行。重建项目后测试通过。

【讨论】:

你能澄清一下重建项目是什么意思吗?我也被这个问题困住了,它肯定与 IntelliJ 相关,但不确定究竟需要做什么来重置它。 如果您使用的是最新版本的 IDEA (14.x),则存在另一个导致相同行为的错误,并且无法重建项目。请参阅youtrack.jetbrains.com/issue/IDEA-138275,在 cmets 中有一个解决方法:在设置中禁用进程中编译:-Dgroovyc.in.process=false。 好的,我正在尝试这个选项,我是否需要做其他事情,因为我仍然看到这个问题? 对不起@dbrin 我没有更多了。也许在 Youtrack 上创建支持票? 我发现你需要经常运行 grails clean,以防止这种情况发生。【参考方案2】:

我也有类似的问题。我只需要刷新 gradle 项目。

    在 IntelliJ 中导航到 Gradle tan。 您可以单击刷新图标或右键单击项目并选择“刷新 Gradle 项目”。

在 IntelliJ 中重新运行测试,错误应该会消失。

【讨论】:

以上是关于在 Intellij Idea 中运行 grails 2.1.3 测试:Spock 测试中出现奇怪错误:无法添加域类 [class x.y.Z]。它不是域的主要内容,如果未能解决你的问题,请参考以下文章

intellij IDEA为啥运行时不编译grails或groovy了。

在 Intellij Idea 中运行 grails 2.1.3 测试:Spock 测试中出现奇怪错误:无法添加域类 [class x.y.Z]。它不是域

IntelliJ IDEA 的零覆盖:带有 Spock 单元测试的 Grails

Intellij IDEA 14 grails run-app 错误

更新到 IntelliJ IDEA Ultimate 2016.2 后找不到 Grails 应用程序

IntelliJ Idea 14 在 grails 应用程序调试时出错