Grails单元测试服务MissingProperty'log'

时间:2014-02-14 09:21:44

标签: unit-testing grails groovy

我想为服务运行单元测试。我想测试的方法包括一些log.debug()语句。虽然log属性是在运行时注入的,但它似乎没有在测试中注入,因此抛出groovy.lang.MissingPropertyException: No such property: log for class:

这是我的单元测试类:

@TestFor(ServiceUnderTest)
@Mock([ServiceUnderTest])
class ServiceUnderTestTests {

    def test() {
        def mock = [ mockedProp: [...] ] as ServiceUnderTest
        def info = mock.doOperation()
        assert ....
    }
}

我也尝试添加MockUtils.mockLogging(ServiceUnderTest),但没有成功。

如何在单元测试中将我的服务类中的log属性正确注入?

1 个答案:

答案 0 :(得分:4)

您不必使用@Mock([ServiceUnderTest])注释测试类。 @TestFor(ServiceUnderTest)检测到它的服务类并自动执行所有模拟操作。它还为测试类添加了service属性,可以在所有测试方法中访问,并相应地模拟log属性。

我认为,在您的情况下,既没有模拟也没有使用MockUtils.mockLogging(ServiceUnderTest)进行显式日志模拟的问题是您在测试方法代码中使用的as强制:

def mock = [ mockedProp: [...] ] as ServiceUnderTest

Groovy在内部使用java.lang.reflect.ProxyServiceUnderTest创建代理后代类。代理类没有看到ServiceUnderTest元类的更改,如添加的log属性。

我会使用 per-object元类解决此问题。您可以通过更改metaClass对象的service来模拟属性getter(或setter)。请注意,Grails会在执行测试方法之间回滚元类更改:

service.metaClass.mockedProp = {-> ... }