簡體   English   中英

集成和單元測試之間存在嚴重污染

[英]Grails pollution between integration and unit tests

我知道關於這個特定主題有很多東西,但是我找不到一個偶然發現我問題的人,希望有人可以向我解釋一下。

我有一個域,在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) ...和所有爵士樂的MissingMethodException: no method signature isDomainClass exists with parameters (java.lang.Class) ...

在測試中要測試的服務中,在測試的集成部分中使用println進行調查時,在調用域類的equals方法之前,我可以很高興地調用grailsApplication.isDomainClass()並獲取預期的影響。 但是,當代碼進入域的equals函數時,盡管grailsApplication對象引用服務中引用的同一對象並具有動態添加的方法,但isDomainClass()方法不再存在。

似乎grails添加到此類的動態方法不是在域的方法中調用時注入的,而是在服務中注入的。 更奇怪的是,只有在集成測試遵循單元測試之后,才會發生這種情況。 如果單獨完成,沒有問題...

這種污染源於何處? 有什么辦法解決嗎?

使用Grails 2.1.0的PS

您必須在destroy方法中從metaClassRegistry中刪除您修改的類(即在測試用例運行之后)。 見下文:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM