unit-testing - 集成和单元测试之间的 Grails 污染

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

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

我有一个域,我在 equals 方法中使用注入(inject)的 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 添加到此类的动态方法在域的方法中调用时并未被注入(inject),而是在服务中被注入(inject)。更奇怪的是,只有在集成测试遵循单元测试时才会发生这种情况。如果分开做,没问题...

这种污染从何而来?有什么办法可以解决吗?

附言使用 Grails 2.1.0

最佳答案

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

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

关于unit-testing - 集成和单元测试之间的 Grails 污染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15115549/

相关文章:

java - 在哪里放置 REST Assured 测试

unit-testing - 如何使用 JUnit5 测试 OpenEJB 中的 EJB Bean?

ios - 在 XCTestCase 中使用 UIImage imageNamed

grails - YAML-groovy-env var不能为整数吗?

C# 我可以运行一个仅在单元测试通过时才执行的方法吗

c# - 集成测试策略资源

c# - Nethereum C# 单元测试 GetTransactionCount

unit-testing - 在这种情况下如何使用模拟?

templates - 在 grails gsp 模板中,如何使用服务器端注释而不会引发错误站点网格?

grails - Grails Excel-import插件编号以指数填充为实数