【问题标题】:Grails pollution between integration and unit tests集成和单元测试之间的 Grails 污染
【发布时间】:2013-02-13 11:08:28
【问题描述】:

我知道关于这个特定主题有很多内容,但是我找不到任何偶然发现我的问题的人,希望有人可以向我解释一下。

我有一个域,我在 equals 方法中使用注入的 grailsApplication 的动态方法“isDomainClass”:

@Override
public boolean equals(Object obj) {
    if(!grailsApplication.isDomainClass(obj.getClass())) { return false }
    ...
}

这很好用,我会对此进行单元测试:

@Mock([MyDomain])
...
def mockGApp
void setUp() {
    mockGApp = new Object()
    mockGApp.metaClass.isDomainClass = { obj -> true }
}
...
void testSomething() {
    def myDomain = new MyDomain()
    myDomain.grailsApplication = mockGApp
    ....
}

当我使用 test-app -unit(在命令行或 STS 中)运行它时,它通过就好了。

然后我进行了一个使用该域的集成测试(这次没有模拟),并且在使用 test-app -integration 运行时再次运行良好(在命令行或在 STS 中)

但是,如果我同时运行“test-app”,那么它会同时执行这两个操作,我会得到 MissingMethodException: no method signature isDomainClass exists with parameters (java.lang.Class) ... 和所有爵士乐。

在我正在测试的服务中使用println 对其进行调查时,在测试的集成部分中,在调用我的域类的equals方法之前,我可以很高兴地调用grailsApplication.isDomainClass()并获得想要的效果。然而,当代码进入域的 equals 函数时,isDomainClass() 方法不再存在,尽管 grailsApplication 对象引用了服务中引用的同一对象并且具有动态添加的方法。

看起来 grails 添加到此类的动态方法在域的方法中调用时并没有被注入,而是在服务中被注入。更奇怪的是,只有在集成测试遵循单元测试时才会发生这种情况。如果分开做,没问题...

这种污染来自哪里?有什么办法解决吗?

附:使用 Grails 2.1.0

【问题讨论】:

  • 我通过使用 .isArtefactOfType('Domain', ... ) 而不是 isDomainClass 找到了解决此问题的方法,但是仍然希望有人能够更多地了解正在发生的事情以及如何避免它

标签: unit-testing grails integration-testing grails-2.1


【解决方案1】:

您必须在 destroy 方法中从 metaClassRegistry 中删除您修改的类(即在测试用例运行之后)。见下文:

@After
void destroy() {
    GroovySystem.metaClassRegistry.removeMetaClass(MyDomain.class)
}

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多