3

我有这样的代码:

@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()。它出什么问题了?

4

1 回答 1

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 对象上调用的所有“方法”的旧存根(再次参见参考资料)。

于 2013-02-17T01:11:32.990 回答