我有一个新答案,我将在这篇文章的顶部发布(我的“旧”答案仍在这篇文章的底部)(在撰写本文时,我的“旧”答案是“0”,所以没有伤害,没有犯规!)
较新的答案:
这是 Gradle 包:
testImplementation 'com.portingle:slf4jtesting:1.1.3'
Maven 链接:
https://mvnrepository.com/artifact/com.portingle/slf4jtesting
德语代码:
(下面的导入和私有方法将进入 MyTestClass(.java))
import static org.junit.Assert.assertNotNull;
import slf4jtest.LogLevel;
import slf4jtest.Settings;
import slf4jtest.TestLogger;
import slf4jtest.TestLoggerFactory;
@Test
public void myFirstTest() {
org.slf4j.Logger unitTestLogger = this.getUnitTestLogger();
ISomethingToTestObject testItem = new SomethingToTestObject (unitTestLogger);
SomeReturnObject obj = testItem.myMethod("arg1");
assertNotNull(wrapper);
/* now here you would find items in the unitTestLogger */
assertContains(unitTestLogger, LogLevel.DebugLevel, "myMethod was started");
}
// render nicer errors
private void assertContains(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 assertNotContains(TestLogger unitTestLogger, LogLevel logLev, String expected) throws Error {
if (unitTestLogger.contains(logLev, expected)) {
throw new AssertionError("expected absence of '" + expected + "' but got '" + unitTestLogger.lines() + "'");
}
}
private TestLogger getUnitTestLogger() {
TestLoggerFactory loggerFactory = Settings.instance()
.enableAll() // necessary as by default only ErrorLevel is enabled
.buildLogging();
TestLogger returnItem = loggerFactory.getLogger(MyTestClasss.class.getName());
assertNotNull(returnItem);
return returnItem;
}
==============================下面的旧答案..不要使用========== ======
以下是我之前的回答。在我发现它(上面的包)之后,我改变了我的下面的代码......以使用上面的包。
So here is my method.
First, I allow the logger to be injected. But I provide a default as well:
```java
package com.mycompany.myproject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyCoolClass { //implements IMyCoolClass {
private static final String PROCESS_STARTED = "Process started. (key='%1$s')";
private final Logger logger;
public MyCoolClass() {
this(LoggerFactory.getLogger(MyCoolClass.class));
}
public MyCoolClass(Logger lgr) {
this.logger = lgr;
}
public doSomething(int key)
{
logger.info(String.format(PROCESS_STARTED, key));
/*now go do something */
}
}
Then I wrote a very basic in memory logger
```java
import org.slf4j.Marker;
import java.util.ArrayList;
import java.util.Collection;
public class InMemoryUnitTestLogger implements org.slf4j.Logger {
public Collection<String> informations = new ArrayList<String>();
public Collection<String> errors = new ArrayList<String>();
public Collection<String> traces = new ArrayList<String>();
public Collection<String> debugs = new ArrayList<>();
public Collection<String> warns = new ArrayList<>();
public Collection<String> getInformations() {
return informations;
}
public Collection<String> getErrors() {
return errors;
}
public Collection<String> getTraces() {
return traces;
}
public Collection<String> getDebugs() {
return debugs;
}
public Collection<String> getWarns() {
return warns;
}
@Override
public String getName() {
return "FakeLoggerName";
}
@Override
public boolean isTraceEnabled() {
return false;
}
@Override
public boolean isTraceEnabled(Marker marker) {
return false;
}
@Override
public boolean isDebugEnabled() {
return false;
}
@Override
public boolean isDebugEnabled(Marker marker) {
return false;
}
@Override
public boolean isWarnEnabled(Marker marker) {
return false;
}
@Override
public boolean isInfoEnabled(Marker marker) {
return false;
}
@Override
public boolean isWarnEnabled() {
return false;
}
@Override
public boolean isErrorEnabled(Marker marker) {
return false;
}
@Override
public boolean isInfoEnabled() {
return false;
}
@Override
public boolean isErrorEnabled() {
return false;
}
@Override
public void trace(String s) {
this.internalTrace(s);
}
@Override
public void trace(String s, Object o) {
this.internalTrace(s);
}
@Override
public void trace(String s, Object o, Object o1) {
this.internalTrace(s);
}
@Override
public void trace(String s, Object... objects) {
this.internalTrace(s);
}
@Override
public void trace(String s, Throwable throwable) {
this.internalTrace(s);
}
@Override
public void trace(Marker marker, String s) {
this.internalTrace(s);
}
@Override
public void trace(Marker marker, String s, Object o) {
this.internalTrace(s);
}
@Override
public void trace(Marker marker, String s, Object o, Object o1) {
this.internalTrace(s);
}
@Override
public void trace(Marker marker, String s, Object... objects) {
this.internalTrace(s);
}
@Override
public void trace(Marker marker, String s, Throwable throwable) {
this.internalTrace(s);
}
@Override
public void debug(String s) {
this.internalDebug(s);
}
@Override
public void debug(String s, Object o) {
this.internalDebug(s);
}
@Override
public void debug(String s, Object o, Object o1) {
this.internalDebug(s);
}
@Override
public void debug(String s, Object... objects) {
this.internalDebug(s);
}
@Override
public void debug(String s, Throwable throwable) {
this.internalDebug(s);
}
@Override
public void debug(Marker marker, String s) {
this.internalDebug(s);
}
@Override
public void debug(Marker marker, String s, Object o) {
this.internalDebug(s);
}
@Override
public void debug(Marker marker, String s, Object o, Object o1) {
this.internalDebug(s);
}
@Override
public void debug(Marker marker, String s, Object... objects) {
this.internalDebug(s);
}
@Override
public void debug(Marker marker, String s, Throwable throwable) {
this.internalDebug(s);
}
public void info(String s) {
this.internalInfo(s);
}
@Override
public void info(String s, Object o) {
this.internalInfo(s);
}
@Override
public void info(String s, Object o, Object o1) {
this.internalInfo(s);
}
@Override
public void info(String s, Object... objects) {
this.internalInfo(s);
}
@Override
public void info(String s, Throwable throwable) {
this.internalInfo(s);
}
@Override
public void info(Marker marker, String s) {
this.internalInfo(s);
}
@Override
public void info(Marker marker, String s, Object o) {
this.internalInfo(s);
}
@Override
public void info(Marker marker, String s, Object o, Object o1) {
this.internalInfo(s);
}
@Override
public void info(Marker marker, String s, Object... objects) {
this.internalInfo(s);
}
@Override
public void info(Marker marker, String s, Throwable throwable) {
this.internalInfo(s);
}
public void error(String s) {
this.internalError(s);
}
@Override
public void error(String s, Object o) {
this.internalError(s);
}
@Override
public void error(String s, Object o, Object o1) {
this.internalError(s);
}
@Override
public void error(String s, Object... objects) {
this.internalError(s);
}
@Override
public void error(String s, Throwable throwable) {
this.internalError(s);
}
@Override
public void error(Marker marker, String s) {
this.internalError(s);
}
@Override
public void error(Marker marker, String s, Object o) {
this.internalError(s);
}
@Override
public void error(Marker marker, String s, Object o, Object o1) {
this.internalError(s);
}
@Override
public void error(Marker marker, String s, Object... objects) {
this.internalError(s);
}
@Override
public void error(Marker marker, String s, Throwable throwable) {
this.internalError(s);
}
public void warn(String s) {
this.internalWarn(s);
}
@Override
public void warn(String s, Object o) {
this.internalWarn(s);
}
@Override
public void warn(String s, Object... objects) {
this.internalWarn(s);
}
@Override
public void warn(String s, Object o, Object o1) {
this.internalWarn(s);
}
@Override
public void warn(String s, Throwable throwable) {
this.internalWarn(s);
}
@Override
public void warn(Marker marker, String s) {
this.internalWarn(s);
}
@Override
public void warn(Marker marker, String s, Object o) {
this.internalWarn(s);
}
@Override
public void warn(Marker marker, String s, Object o, Object o1) {
this.internalWarn(s);
}
@Override
public void warn(Marker marker, String s, Object... objects) {
this.internalWarn(s);
}
@Override
public void warn(Marker marker, String s, Throwable throwable) {
this.internalWarn(s);
}
private void internalDebug(String s) {
System.out.println(s);
this.debugs.add(s);
}
private void internalInfo(String msg) {
System.out.println(msg);
this.informations.add(msg);
}
private void internalTrace(String msg) {
//??System.out.println(msg);
this.traces.add(msg);
}
private void internalWarn(String msg) {
System.err.println(msg);
this.warns.add(msg);
}
private void internalError(String msg) {
System.err.println(msg);
this.errors.add(msg);
}
然后在我的单元测试中,我可以做以下两件事之一:
private ByteArrayOutputStream setupSimpleLog(Logger lgr) {
ByteArrayOutputStream pipeOut = new ByteArrayOutputStream();
PrintStream pipeIn = new PrintStream(pipeOut);
System.setErr(pipeIn);
return pipeOut;
}
private Logger getSimpleLog() {
Logger lgr = new InMemoryUnitTestLogger();
return lgr;
}
private void myTest() {
Logger lgr = getSimpleLog();
ByteArrayOutputStream pipeOut = this.setupSimpleLog(lgr);
MyCoolClass testClass = new MyCoolClass(lgr);
int myValue = 333;
testClass.doSomething(myValue);
String findMessage = String.format(MyCoolClass.PROCESS_STARTED, myValue);
String output = new String(pipeOut.toByteArray());
assertTrue(output.contains(findMessage));
}
或与上述类似,但在自定义 Logger 上进行强制转换
private void myTest() {
Logger lgr = getSimpleLog();
MyCoolClass testClass = new MyCoolClass(lgr);
int myValue = 333;
testClass.doSomething(myValue);
String findMessage = String.format(MyCoolClass.PROCESS_STARTED, myValue);
InMemoryUnitTestLogger castLogger = (InMemoryUnitTestLogger)lgr;
/* now check the exact subcollection for the message) */
assertTrue(castLogger.getInfos().contains(findMessage));
}
对代码持保留态度,想法就在那里。我没有编译代码。