【发布时间】:2014-12-24 13:04:38
【问题描述】:
我正在尝试在集成测试中模拟对外部服务的调用,该服务用于 grails webflow。该服务不在流或对话范围内,但通过依赖注入添加,请参阅here。
我已经设法找到一种方法来覆盖服务,方法是使用 ExpandoMetaClass 替换它的元类。这些更改仅在单独运行测试时有效,如果在此测试之前运行另一个使用相同服务的测试,则元类更改将消失。
覆盖元类的部分:
static {
ExpandoMetaClass someService = new ExpandoMetaClass(Object, false)
someService.invokeMethod = { String name, args ->
def result = 'success'
if(name.equals('accessAnotherSystem')
{
StackTraceUtils.sanitize(new Throwable()).stackTrace.each
{
if(it.methodName.equals('test_method_I_Want_failure_in')
{
result = 'exception'
}
}
return result
}
def validMethod = SomeService.metaClass.getMetaMethod(name, args)
if (validMethod != null)
{
validMethod.invoke(delegate, args)
}
else
{
SomeService.metaClass.invokeMissingMethod(delegate, name, args)
}
}
someService.initialize()
SomeService.metaClass = someService
}
相关问题:How to change a class's metaClass per test
有没有办法保留我对测试所做的更改,或者有其他方法可以覆盖服务。
【问题讨论】:
-
您在应用中的何处添加了此代码?
-
在测试类之前的任何测试方法。
标签: grails dependency-injection integration-testing spring-webflow expandometaclass