Grails 模拟日志对象

Grails 模拟日志对象,grails,groovy,mocking,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 << [leve

我有这样的代码:

@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()
    }
}
@TestFor(MyService)
类myservicests{
无效测试(){
def logTo=[]
def loggerMock=mockFor(service.log.class)
loggerlock.demand.error(1..1){String msg,异常ex->
logTo>>(MyServiceTests.groovy:25)

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

这是一条非常不具信息性的错误消息,我在尝试模拟没有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
  }
资料来源:


这可能比您需要的要复杂得多。我假设您正在测试某个使用记录器的类?希望该类不会按类引用该记录器(静态类型),而是使用“def”。在这种情况下,您可以只传入任何旧存根(再次查看引用)这恰好包含了您的类对Logger对象调用的所有“方法”。

谢谢您的回答。您是对的,没有0-arg构造函数,因此根据您的建议,我尝试使用代理实例。不幸的是,我得到了一个
GroovyCastException
无法强制转换对象“SLF4JLog”_delegateProxy@ef57f8“用class'SLF4JLog_delegateProxy'到类'org.apache.commons.logging.Log'
,但最终我找到了一个解决方案:我只需用接口的显式名称替换问题中的
service.Log.class
org.apache.commons.logging.Log
,它不需要构造函数。
  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
  }