我有这样的代码:
@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()
行。怎么了?
答案 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对象上调用的所有“方法”。