2015-05-05 7 views
12

यूनिट परीक्षण चलाते समय, मैं किसी भी परीक्षण को विफल करना चाहता हूं जिसके दौरान ERROR स्तर संदेश लॉग होता है। एसएलएफ 4 जे/लॉगबैक का उपयोग करके इसे हासिल करने का सबसे आसान तरीका क्या होगा? मैं अपने स्वयं के ILoggerFactory कार्यान्वयन लिखने से बचना चाहता हूँ।त्रुटि लॉग इन घटनाओं पर लॉगबैक फेंक दें

मैंने कस्टम एपेंडर लिखने की कोशिश की, लेकिन मैं एपेंडर को कॉल करने वाले कोड के माध्यम से अपवादों का प्रचार नहीं कर सकता, एपेंडर से सभी अपवाद वहां पकड़े गए।

उत्तर

0

तो, अगर आप लॉगर के किसी भी त्रुटि रिपोर्टिंग संदेश को कॉल करते हैं तो आप अपने टेस्ट केस को विफल करना चाहते हैं।

  1. कोडर को परीक्षण करने के लिए कोड को जोड़ने के लिए निर्भरता इंजेक्शन का उपयोग करें जिसका उपयोग करना चाहिए।
  2. एसएलएफ 4 जे लॉगर इंटरफ़ेस लागू करने वाले परीक्षण डबल को कार्यान्वित करें, और जो अधिकांश विधियों के लिए कुछ भी नहीं करता है, लेकिन त्रुटि लॉगिंग विधियों के लिए एक AssertionError फेंकता है।
  3. परीक्षण मामले के सेट-अप भाग में, परीक्षण डबल इंजेक्ट करें।
0

लॉगिंग फ्रेमवर्क आम तौर पर उपयोगकर्ता को कोई अपवाद फेंकने के लिए डिज़ाइन नहीं किए जाते हैं। एक अन्य विकल्प (राइडवाल्ड के उत्तर के अतिरिक्त) एक कस्टम एपेंडर बनाना होगा जो एक त्रुटि बूलियन ध्वज को सही पर सेट करता है जब एक त्रुटि संदेश लॉग होता है, इस ध्वज को सेटअप विधि में रीसेट करें और इसे एक टियरडाउन विधि में जांचें (या एक जुनीट बनाएं ध्वज को रीसेट/चेक करने के लिए नियम)।

4

कुंजी एक कस्टम एपेंडर लिखना है। आप यह नहीं कहते कि आप किस इकाई परीक्षण ढांचे का उपयोग करते हैं, लेकिन जुनीट के लिए मुझे कुछ ऐसा करने की ज़रूरत है (यह केवल सभी त्रुटियों की तुलना में थोड़ा अधिक जटिल था, लेकिन मूल रूप से एक ही अवधारणा), और एक जुनीट @ रूल बनाया जिसने मेरे एपेंडर को जोड़ा , और एपेंडर आवश्यकतानुसार परीक्षण में विफल रहता है।

मैं सार्वजनिक क्षेत्र में इस उत्तर के लिए मेरी कोड जगह:

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 विधि से गुजरता है। यह वही काम करता है यदि परीक्षण वास्तविक कक्षा-अंडर-टेस्ट को कॉल करता है जो त्रुटि को लॉग करता है।

संबंधित मुद्दे