【问题标题】:Grails Unit Test Service MissingProperty 'log'Grails 单元测试服务 MissingProperty 'log'
【发布时间】:2014-02-14 20:31:58
【问题描述】:

我想为服务运行单元测试。我要测试的方法包括一些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),但没有成功。

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

【问题讨论】:

    标签: unit-testing grails groovy


    【解决方案1】:

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

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

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

    Groovy 内部使用java.lang.reflect.ProxyServiceUnderTest 创建代理后代类。代理类看不到对 ServiceUnderTest 元类所做的更改,例如添加的 log 属性。

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

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

    【讨论】:

    • 感谢工作。 Groovy 是如此强大,以至于很难在特定问题上使用正确的方法......
    • 是的,很多事情发生在幕后。有时,就像在这个示例中一样,您需要了解其中的一些内容 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多