Matt Sicker created LOG4J2-495:
----------------------------------
Summary: As a unit test developer, I want a JUnit rule to handle
specific external configuration files.
Key: LOG4J2-495
URL: https://issues.apache.org/jira/browse/LOG4J2-495
Project: Log4j 2
Issue Type: Story
Components: API, Core
Affects Versions: 2.0-rc1
Environment: Inside any JUnit test that relies on a specific
log4j2.xml file. For example, FileConfigTest in core.
Reporter: Matt Sicker
Priority: Minor
There are many unit tests that have the same boilerplate code over and over
again:
{code:java}
private static final String CONFIG = "...";
private static LoggerContext ctx;
@BeforeClass
public static void setupClass() {
System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,
CONFIG);
ctx = (LoggerContext) LogManager.getContext(false);
}
@AfterClass
public static void cleanupClass() {
System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY);
ctx.reconfigure();
StatusLogger.getLogger().reset();
}
{code}
This sort of pattern can be replaced with a quick implementation of
{{org.junit.rules.ExternalResource}} like so:
{code:java}
package org.apache.logging.log4j.test.rule;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.status.StatusLogger;
import org.junit.rules.ExternalResource;
public class ExternalConfig extends ExternalResource {
private final String configFileName;
private LoggerContext ctx;
public ExternalConfig(String configFileName) {
this.configFileName = configFileName;
}
@Override
protected void before() throws Throwable {
System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,
this.configFileName);
this.ctx = (LoggerContext) LogManager.getContext(false);
}
@Override
protected void after() {
System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY);
this.ctx.reconfigure();
StatusLogger.getLogger().reset();
}
public LoggerContext getContext() {
return this.ctx;
}
}
{code}
Now, instead of a class using the same {{@BeforeClass}} and {{@AfterClass}}
template, it can use something like the following:
{code:java}
private static final String CONFIG = "...";
@ClassRule
public static ExternalConfig config = new ExternalConfig(CONFIG);
{code}
This helps reduce a lot of repeated code. I'll submit a patch that cleans up
the unit tests with this in a little while.
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]