首页 > 解决方案 > 将 Log4J 与 JUnit 和 Gradle 一起使用

问题描述

我有一个带有 JUnit 测试的 Gradle 项目,这些测试在项目构建时运行。

该项目也是码头化的。在 docker 容器内,项目使用 Java 和 Tomcat 运行。

所有测试都通过了,但我在控制台中收到错误消息:

com.myapp.MyObjectTest > testGetData STANDARD_ERROR
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /tomcat/website/webapps/app/logs/logFile.log (No such file or directory)

在我的 log4j xml 文件中,我有这个附加程序:

<appender name="rolling" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="/tomcat/website/webapps/app/logs/logFile.log" />
    <param name="MaxFileSize" value="1000KB" />
    <param name="MaxBackupIndex" value="2" />    
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM dd HH:mm:ss} %F: %m%n" /> 
    </layout>
</appender>

JUnit 测试中有引用使用日志文件的类。

我明白为什么会出现此错误;这是因为 JUnit 测试是在 docker 容器之外运行的,所以它找不到/tomcat/website/webapps/app/logs/目录。我想我可以使用源文件夹中的日志目录,但我不能在 log4j xml 文件中更改它,因为当项目实际运行时,它不会正确记录。

知道如何纠正这个问题吗?

标签: javaunit-testingdockerjunitlog4j

解决方案


如果我的理解是正确的,您可以在运行容器JUnit的主机上运行测试。Tomcat如果您只需要访问../app/logs容器目录中的日志文件,那么您可以创建带有卷的 docker 容器。例如使用Gradle docker 插件

task createBuildContainer(type: DockerCreateContainer) {
 doFirst {
    def hostPath = (file("/path/on/host")).getAbsolutePath()
}

 volumes = [ '/tomcat/website/webapps/app/logs/' ]
 binds = [ (hostPath) : '/tomcat/website/webapps/app/logs/' ]
...
}

它将在主机和容器之间共享日志,JUnit测试将能够读取它们。希望能帮助到你


推荐阅读