Grails在集成测试期间记录

时间:2010-10-26 12:59:40

标签: logging grails log4j

我在测试[grails test-app,Grails 1.3.5]中运行Grails日志时遇到的问题很少:

1

我的应用程序中有一些调试/信息记录,它在运行应用程序[grails run-app]时工作正常。 但是,当我想测试我的应用程序时,它们都没有写入System.out / System.err文件,也没有写入文件appender。 我该如何启用它?

我的域类中有log.debug()和log.info()行。在控制器和位于src / groovy的类中。

当我想在测试期间启用日志记录时,我只是从我的开发环境中复制了设置,并将root logger从info更改为debug:

    appenders {
        file name: 'file', file: 'mylog.log'
    }

    root {
        debug 'stdout', 'file'
    }

    debug 'grails.app'


    error 'org.codehaus.groovy.grails.web.servlet',  //  controllers
            'org.codehaus.groovy.grails.web.pages', //  GSP
            'org.codehaus.groovy.grails.web.sitemesh', //  layouts
            'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
            'org.codehaus.groovy.grails.web.mapping', // URL mapping
            'org.codehaus.groovy.grails.commons', // core / classloading
            'org.codehaus.groovy.grails.plugins', // plugins
            'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
            'org.springframework',
            'org.hibernate',
            'net.sf.ehcache.hibernate'

    warn 'org.mortbay.log'

正如我先前所说。如果我在开发环境中运行应用程序,一切正常。这只是我无法看到我的日志的测试。

这里要提一下:我可以在Test类中看到我的log.info()行。

2 我无法在Test类中指定log.debug。我在尝试做log.debug时遇到方法异常。 log.info工作得很好。怎么会?我认为它与控制器/域内的注入相同。

3 在测试期间记录在测试类中的所有信息都将发送到System.err而不是System.out。 Grails甚至使用Config.groovy中的log4j配置?

提前致谢, 克里斯蒂安

2 个答案:

答案 0 :(得分:4)

我所做的只是定义我自己的记录器并将其注入我的测试用例中的控制器或服务中。

    BasicConfigurator.configure() 
    LogManager.rootLogger.level = Level.DEBUG
    log = LogManager.getLogger("MailService")

    MailService.class.metaClass.getLog << {-> log}

我不相信log属性被注入测试类

我之前做过这件事,结果证明这更像是一个黑客但工作

    def logger = new Expando(
            debug: { println it },
            info: { println it },
            warn: { println it },
            error: { println it })
    MailService.metaClass.getLog = {-> logger }
    MailServiceService.metaClass.getLog = {-> logger }
    MailIngestJobTests.metaClass.getLog = {-> logger }

Final Code Solution Here

答案 1 :(得分:1)

我认为你可能想要使用类似的东西:

mockLogging(Foo, true)

Foo是域名,服务等

这会将log.debug消息写入您的控制台。只是在做任何报告之前尝试删除它,因为它们将成为looooooong:)