我一再遇到Grails在1.1版中引入的用于配置Log4J的DSL的问题。我目前的配置如下:
log4j = {
debug 'com.mypackages'
appenders {
console name: 'stdout', layout: pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n')
rollingFile name: 'hibeFile', file: "hibeFile", maxFileSize: '500KB'
}
// By default, messages are logged at the error level to both the console and hibeFile
root {
error 'stdout', 'hibeFile'
additivity = true
}
}
这里的目的是:
com.mypackages
,在错误级别记录所有其他人当我运行应用程序或集成测试时,这很好用。但是,当我运行单元测试时,控制台或Grails测试报告中显示的“System.out”或“System.err”链接中不会显示任何日志记录。如何在运行单元测试时查看我的日志?
谢谢, 唐
答案 0 :(得分:2)
AFAIK,在运行Grails单元测试时,无法通过log4j获取整个日志记录,域类等中的log.xxxx调用仅使用
进行模拟mockLogging(ClassUnderTest, true)
“true”代表“启用调试”。为此,单元测试类必须扩展GrailsUnitTestCase。 如果使用mockController(class),它会隐式调用mockLogging(class,false),因此您不会获得调试日志记录。有关详细信息,请查看grails源代码,例如GrailsUnitTestCase和MockUtils。
与上述相反,在集成测试中,整个机器启动并且log4j可用。
答案 1 :(得分:1)
这是一个想法,你没有完全问这个问题,但是在grails用户组上提出了同样的问题。我也在这里发布我的答案,以传播知识。
如果你明确地在你的类中说def log = org.apache.commons.logging.LogFactory.getLog(this)而不是依赖于grails用户组所解释的依赖注入,你可以在LogFactory上模拟getLog。
以下内容取自grails.tests.MockUtils.mockLogging并修改为返回记录器。
class LoggingEnabledTestCase extends GrailsUnitTestCase {
protected void setUp() {
super.setUp()
registerMetaClass(org.apache.commons.logging.LogFactory)
org.apache.commons.logging.LogFactory.metaClass.'static'.getLog = {instance ->
// This is taken from grails.tests.MockUtils and slightly changed to return a logger.
// Get the name of the class + the last component of the package
// (if it the class is in a package).
def pos = instance.class.name.lastIndexOf('.')
if (pos != -1) pos = instance.class.name.lastIndexOf('.', pos - 1)
def shortName = instance.class.name.substring(pos + 1)
// Dynamically inject a mock logger that simply prints the
// log message (and optional exception) to stdout.
def mockLogger = [
fatal: {String msg, Throwable t = null ->
println "FATAL (${shortName}): $msg"
if (t) {
println " Exception thrown - ${t.message}"
}
},
error: {String msg, Throwable t = null ->
println "ERROR (${shortName}): $msg"
if (t) {
println " Exception thrown - ${t.message}"
}
},
warn: {String msg, Throwable t = null ->
println "WARN (${shortName}): $msg"
if (t) {
println " Exception thrown - ${t.message}"
}
},
info: {String msg, Throwable t = null ->
println "INFO (${shortName}): $msg"
if (t) {
println " Exception thrown - ${t.message}"
}
},
debug: {String msg, Throwable t = null ->
println "DEBUG (${shortName}): $msg"
if (t) {
println " Exception thrown - ${t.message}"
}
},
trace: {String msg, Throwable t = null -> },
isFatalEnabled: {-> true},
isErrorEnabled: {-> true},
isWarnEnabled: {-> true},
isInfoEnabled: {-> true},
isDebugEnabled: {-> true},
isTraceEnabled: {-> false}] as Log
return mockLogger
}
}
protected void tearDown() {
super.tearDown()
}
}
答案 2 :(得分:0)
使用Grails 1.1.1和您的设置的近似值,我有一个名为FooTests.groovy
的单元测试
运行grails test-app
后,我能够在目录中看到测试的输出:
./test/reports/plain
具体在文件中,视情况而定:
TEST-com.mypackages.FooTests-err.txt
TEST-com.mypackages.FooTests-out.txt
TEST-com.mypackages.FooTests.txt
请注意,我在hibeFile中看不到任何输出。我不确定,但我怀疑之前的海报是正确的,因为单元测试没有收到日志设置。