If you (allow) for the injection of a logger, you can use.
testImplementation group: 'com.portingle', name: 'slf4jtesting', version: portingleSlf4jtestingVersion
https://github.com/portingle/slf4jtesting
You class looks like this:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
public final class MyThing {
private Logger logger;
@Inject
MyThingTest() {
this(LoggerFactory
.getLogger(MyThing.class));
}
public MyThing(final Logger lgr) {
if (null == lgr) {
throw new IllegalArgumentException("Logger is null");
}
this.logger = lgr;
}
In your Unit Test code, you have have something like this:
@Test
public void myTest() {
TestLogger unitTestLogger = this.getUnitTestLogger();
MyThing testItem = new MyThing(unitTestLogger);
testItem.doSomethingWithLogs();
}
private TestLogger getUnitTestLogger() {
TestLoggerFactory loggerFactory = Settings.instance()
.enableAll() // necessary as by default only ErrorLevel is enabled
.buildLogging();
TestLogger returnItem = loggerFactory.getLogger(MyThingTest.class.getName());
assertNotNull(returnItem);
return returnItem;
}
// render nicer errors
private void assertLoggerContains(TestLogger unitTestLogger, LogLevel logLev, String expected) throws Error {
if (!unitTestLogger.contains(logLev, expected)) {
throw new AssertionError("expected '" + expected + "' but got '" + unitTestLogger.lines() + "'");
}
}
// render nicer errors
private void assertLoggerNotContains(TestLogger unitTestLogger, LogLevel logLev, String expected) throws Error {
if (unitTestLogger.contains(logLev, expected)) {
throw new AssertionError("expected absence of '" + expected + "' but got '" + unitTestLogger.lines() + "'");
}
}