如何在 JUnit 测试期间配置 J.U.L. 日志记录?

4
我遇到了与此类似的问题:如何在Junit测试期间将日志级别设置为DEBUG?——但我使用的是`java.util.logging`而不是Log4j。
具体来说,我正在将一个现有的(使用Maven构建的)应用程序从Log4j转换为`java.util.logging`,以满足客户要求(不可协商)。一切都使用SLF4J,所以代码更改很小。有数千个测试类,分布在几个模块中;我们目前在这些模块的`src/test/resources`中有一个`log4j.properties`文件,用于自定义测试日志输出。
我认为对于测试日志输出来说易于定制非常重要:如果开发人员破坏了测试并想要阅读日志输出,我希望他们本地调整日志配置,而不是开始乱改(精心选择的)代码中的日志级别,导致“所有信息都记录在info级别”综合症。请注意,我希望测试日志配置适用于“在测试条件下执行时的测试+应用程序代码”。
我不想为每个测试类添加日志设置(如此处所建议:如何为JUnit测试设置日志级别),因为测试数量很大。这似乎不是正确的解决方案。我也不想编辑JVM的`logging.properties`文件,因为那会影响到整个系统。这个应用程序不是我唯一要做的事情。我还必须让其他人做出相同的改变。
现有的系统之所以有效果,是因为Log4j从类路径中获取`/log4j.properties`。`java.util.logging`是否有等效的机制? 目前的想法:添加一个`logging.properties`文件来替换现有配置,并尝试修改Maven配置,将`java.util.logging.config.file`参数设置为指向它。还有更简洁的方法吗?
2个回答

4

项目范围内的 src/test/resources/logging.properties 可以通过在 @BeforeClass 方法中使用单行代码,使用 java.util.logging.config.file 系统属性来设置专门用于单元测试的日志记录配置文件:

System.setProperty("java.util.logging.config.file", ClassLoader.getSystemResource("logging.properties").getPath());

当你说“在你的@BeforeClass方法中”时,我认为我需要在每个测试类中都这样做,是吗?这比在pom的surefire配置中设置更好吗? - SusanW
@SusanW 是的,每个测试类都需要在 @BeforeClass 中使用它。你可能也可以在测试套件中设置一些东西,但我只需要一个一行代码的东西,让我在运行单元测试时控制日志级别。你只需要一个 logging.properties 文件,但你也可以按类别进行设置,只需更改资源名称或使用 this.getClass().getResourceAsStream('logging.properties') 或类似的东西即可。至于比其他方法更好/更差,我使用 Ivy 而不是 Maven,并且我喜欢在 JUnit 和 Ivy 之间保持清晰的分离。 - Parker

2
“有更简洁的方法吗?”
“那可能是设置日志配置最可靠的方法。”
“是否有等效的机制适用于java.util.logging?”
“配置选项列在java.util.logging.LogManager文档中。您可以:”
java.util.logging.config.file 属性设置为一个属性文件,并使用它。
java.util.logging.config.class 属性设置为一个类文件,并创建一个无参构造函数来执行任何你希望手动配置的记录器代码。
使用 LogManager.readConfiguration(InputStream)ClassLoader.getResourceAsStream(String) 来加载新的配置。这个逻辑也可以与 java.util.logging.config.class 属性结合使用。

谢谢您的回答!希望我可以在这周尝试它,只要我能抵挡住分心的干扰…… - SusanW
好的,我终于有机会和它玩耍了,并且我已经在全局POM中配置了Maven,以添加java.util.logging.config.file系统属性到surefire。我将在我的问题中添加一个注释,显示详细信息。谢谢! - SusanW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接