模拟日志对象

时间:2013-02-15 14:40:34

标签: grails groovy mocking

我有这样的代码:

@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()行。怎么了?

1 个答案:

答案 0 :(得分: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”。在这种情况下,您可以传入任何旧的Stub(再次参见参考资料),该Stub恰好具有您的类在Logger对象上调用的所有“方法”。