在 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 错误