我知道有很多关于这个特定主题的内容,但是我找不到任何偶然发现我的问题的人,希望有人可以向我解释这一点。
我有一个域,我在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方法之前,我可以很高兴地调用{ {1}}并获得所需的效果。但是,当代码进入域的equals函数时,grailsApplication.isDomainClass()
方法不再存在,尽管isDomainClass()
对象引用了服务中引用的同一对象,并且具有动态添加的方法。
似乎grails添加到此类的动态方法在域的方法中被调用但是在服务中被注入时不被注入。更奇怪的是,只有在集成测试遵循单元测试时才会发生这种情况。如果单独完成,没有问题...
这种污染源自哪里?有没有办法解决它?
P.S。使用Grails 2.1.0
答案 0 :(得分:0)
您必须在destroy方法中删除您从metaClassRegistry修改的类(即在测试用例运行之后)。见下文:
@After
void destroy() {
GroovySystem.metaClassRegistry.removeMetaClass(MyDomain.class)
}