कुंजी एक कस्टम एपेंडर लिखना है। आप यह नहीं कहते कि आप किस इकाई परीक्षण ढांचे का उपयोग करते हैं, लेकिन जुनीट के लिए मुझे कुछ ऐसा करने की ज़रूरत है (यह केवल सभी त्रुटियों की तुलना में थोड़ा अधिक जटिल था, लेकिन मूल रूप से एक ही अवधारणा), और एक जुनीट @ रूल बनाया जिसने मेरे एपेंडर को जोड़ा , और एपेंडर आवश्यकतानुसार परीक्षण में विफल रहता है।
मैं सार्वजनिक क्षेत्र में इस उत्तर के लिए मेरी कोड जगह:
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import org.junit.rules.ExternalResource;
import org.slf4j.LoggerFactory;
import static org.junit.Assert.fail;
/**
* A JUnit {@link org.junit.Rule} which attaches itself to Logback, and fails the test if an error is logged.
* Designed for use in some tests, as if the system would log an error, that indicates that something
* went wrong, even though the error was correctly caught and logged.
*/
public class FailOnErrorLogged extends ExternalResource {
private FailOnErrorAppender appender;
@Override
protected void before() throws Throwable {
super.before();
final LoggerContext loggerContext = (LoggerContext)(LoggerFactory.getILoggerFactory());
final Logger rootLogger = (Logger)(LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME));
appender = new FailOnErrorAppender();
appender.setContext(loggerContext);
appender.start();
rootLogger.addAppender(appender);
}
@Override
protected void after() {
appender.stop();
final Logger rootLogger = (Logger)(LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME));
rootLogger.detachAppender(appender);
super.after();
}
private static class FailOnErrorAppender extends AppenderBase<ILoggingEvent> {
@Override
protected void append(final ILoggingEvent eventObject) {
if (eventObject.getLevel().isGreaterOrEqual(Level.ERROR)) {
fail("Error logged: " + eventObject.getFormattedMessage());
}
}
}
}
उपयोग का एक उदाहरण:
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ExampleTest {
private static final Logger log = LoggerFactory.getLogger(ExampleTest.class);
@Rule
public FailOnErrorLogged failOnErrorLogged = new FailOnErrorLogged();
@Test
public void testError() {
log.error("Test Error");
}
@Test
public void testInfo() {
log.info("Test Info");
}
}
testError विधि विफल रहता है और testInfo विधि से गुजरता है। यह वही काम करता है यदि परीक्षण वास्तविक कक्षा-अंडर-टेस्ट को कॉल करता है जो त्रुटि को लॉग करता है।
स्रोत
2016-01-22 16:05:26