0

我正在使用 ExpandoMetaClass 使服务在集成测试中始终返回成功,但我希望有一个实际上失败的测试。

ExpandoMetaClass 的使用示例:

static {
        ExpandoMetaClass someService = new ExpandoMetaClass(Object, false)
        someService.accessAnotherSystem = { return 'success' }
        someService.initialize()
        SomeService.metaClass = someService
    }

注意:目前该服务没有为控制器定义,但因为它是一个引用名为SomeServicelike的类的 spring beansomeService.accessAnotherSystem()工作得很好,即def someService控制器中没有。

因此我不能controller.someService.metaClass.accessAnotherSystem = { return 'failure'}从集成测试中做。

另请注意:这是一个 webflow 的集成测试。

是否可以为一项测试重置元类,或者以某种方式测试我想要的?

4

1 回答 1

0

如果测试本身运行,则下面的工作正常,但是如果在它之前运行另一个使用 SomeService 的测试,则会覆盖 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('method_I_Want_failure')
                {
                    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
}
于 2014-12-23T15:40:53.903 回答