[英]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.