【问题标题】:Mocking the log object模拟日志对象
【发布时间】:2013-02-15 14:40:34
【问题描述】:

我有这样的代码:

@TestFor(MyService)
class MyServiceTests {
    void testIt() {
        def logTo = []
        def loggerMock = mockFor(service.log.class)
        loggerMock.demand.error(1..1) { String msg, Exception ex ->
            logTo << [level: 'error', msg: msg, ex: ex]
        }
        service.log = loggerMock.createMock()
    }
}

它失败了:

| Failure:  testIt(MyServiceTests)
|  java.lang.ArrayIndexOutOfBoundsException: 0
    at SLF4JLog_groovyProxy.<init>(Script1.groovy:4)
    at Script1.run(Script1.groovy:8)
    at grails.test.GrailsMock.createMock(GrailsMock.groovy:91)
    at package.MyServiceTests.testIt>>>(MyServiceTests.groovy:25)

指向service.log = loggerMock.createMock() 行。它有什么问题?

【问题讨论】:

    标签: grails groovy mocking


    【解决方案1】:

    这是我在尝试模拟没有 0 参数构造函数的对象时收到的非常不具信息性的错误消息。我不知道你试图在那里模拟什么类,因为你是从另一个类的成员那里得到的,但我会检查它是否可以构造为 Bean(没有参数),如果不,这可能是问题所在。

    再看一点,我猜 SLF4JLog 类没有 0 参数构造函数。为了使用 mockFor 模拟它,您需要按照以下方式进行操作(请注意,您需要确定 SLF4JLog 构造函数可以接受哪些参数:

      void test_create_proxy_instance_with_constructor_arguments() {
        def mock = new MockFor(MockForTestClassWithConstructorArgs)
        mock.demand.amethod { "from mock with proxy"}
    
        def proxy = mock.proxyInstance(["value1", "value2"]as Object[])
        assertEquals "from mock with proxy", proxy.amethod()
        mock.verify proxy
      }
    

    来源:http://groovy.codehaus.org/Using+MockFor+and+StubFor

    这可能比您需要的更多。我想你正在测试一些使用记录器的类?希望该类不按类(静态类型)引用该记录器,而是使用“def”。在这种情况下,您可以传入任何恰好具有您的类在 Logger 对象上调用的所有“方法”的旧存根(再次参见参考资料)。

    【讨论】:

    • 感谢您的回答。你是对的,没有 0-arg 构造函数,所以我尝试使用代理实例,根据你的建议。不幸的是,我得到了一个 GroovyCastException: Cannot cast object 'SLF4JLog_delegateProxy@ef57f8' with class 'SLF4JLog_delegateProxy' to class 'org.apache.commons.logging.Log' 并且无法解决它。但最后我找到了解决方案:我只需将问题中的service.log.class 替换为接口的显式名称:org.apache.commons.logging.Log,这不需要构造函数。
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多