2013-10-17 15 views
6

का उपयोग कर जावा सेवा में स्थैतिक लॉगर्स की नकल करने की रणनीति क्या है, मुझे लगता है कि लॉगर्स को पॉवरमॉक या कुछ प्रकार के ओवरराइड कन्स्ट्रक्टर की मदद से मज़ाक उड़ाया गया है जो लॉगर लेता है।नकली

लॉगर होने के कारण पूरे कोड में इस्तेमाल किया जा रहा है, क्या यह सिर्फ मॉकिटो का उपयोग करने का एक आसान तरीका नहीं है? कॉल को अनदेखा करने या इसे नकल करने का कोई तरीका - मैं किसी भी संदेश को सत्यापित नहीं करना चाहता हूं, बस नल पॉइंटर अपवाद

मैं फ्रेमवर्क का मज़ाक उड़ाने के लिए नया हूं इसलिए मैं सोच रहा हूं कि मिश्रण करने और दो मिलान करने के बजाय जेमॉकिट का उपयोग करना लाइब्रेरीज़- अब तक जोमॉकिट से बचने का एकमात्र कारण है - बस इतना ही शक्ति पूर्ण है और आसानी से दुरुपयोग किया जा सकता है!

+1

तुम क्यों वालों नकली करने की आवश्यकता है: यह कैसे मैं Mockito का उपयोग कर ऐसा कर रहा है? लॉगिंग क्यों न करें? आप लॉगिंग के लिए एक टेस्ट कॉन्फ़िगरेशन सेट अप कर सकते हैं जो फ़ाइल को लिखे जाने से रोक देगा (उदाहरण के लिए बस कंसोल पर सभी लॉगिंग भेजें)। –

+0

हम्म, सरल और बेहतर आइडिया। – cpandey05

उत्तर

4

मैं उन मामलों में लॉग के सत्यापन का उपयोग करता हूं जहां मुझे लगता है कि एक निश्चित स्तर पर लॉग करना बहुत महत्वपूर्ण है।

उपयोगिता कक्षा

public final class LoggingTestUtil { 

    private LoggingTestUtil() { 
    } 

    public static void setupLoggingMock(Logger logger, Appender<ILoggingEvent> appender) { 
     logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
     when(appender.getName()).thenReturn("MOCK"); 
     logger.addAppender(appender); 
    } 

    public static void verifyLogAppended(Appender<ILoggingEvent> appender, final String loggedString) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       return ((LoggingEvent) argument).getMessage().contains(loggedString); 
      } 
     })); 
    } 

    public static void verifyLogAppendedAtLevel(Appender<ILoggingEvent> appender, final Level level) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       return ((LoggingEvent) argument).getLevel().equals(level); 
      } 
     })); 
    } 

    public static void verifyLogAppendedAtLevel(Appender<ILoggingEvent> appender, final Level level, final String loggedString) { 
     verify(appender).doAppend(argThat(new ArgumentMatcher<LoggingEvent>() { 
      @Override 
      public boolean matches(final Object argument) { 
       LoggingEvent event = (LoggingEvent) argument; 
       return event.getLevel().equals(level) && event.getMessage().contains(loggedString); 
      } 
     })); 
    } 
} 

टेस्ट कक्षा में

private static Logger root; 
@Mock 
private static Appender<ILoggingEvent> mockAppender; // used to test that logging occurs 

    @Test 
    public final void testSomething(){ 
     LoggingTestUtil.setupLoggingMocks(root, mockAppender); 
     underTest.doSomethingBad(); 
     LoggingTestUtil.verifyLogAppendedAtLevel(mockAppender, Level.ERROR, "bad thing"); 
    } 
+3

मुझे विश्वास है कि मॉकिंग लॉग सत्यापन के लिए एक खराब रणनीति है क्योंकि यह भंगुर है और अधिक है। मैंने एक जुनीट नियम बनाया है जो log4j में डिफ़ॉल्ट लॉगर में एक अस्थायी ऐपेंडर जोड़ता है। इसके बाद परीक्षण में नियम जोड़कर लॉगिंग के सत्यापन की अनुमति मिलती है। https://github.com/dancerjohn/LibEx/blob/master/testlibex/src/main/java/org/libex/test/logging/log4j/Log4jCapturer.java –

+0

@ जॉन बी - दिलचस्प ... इसे जांच लेंगे। मुझे यह समाधान भंगुर लगता है क्योंकि स्तर/स्ट्रिंग में परिवर्तन होने पर यह टूट जाता है। हालांकि क्या इस संबंध में एक नियम बिल्कुल वैसा ही नहीं होगा? क्या आप का मतलब है कि मोक्स बहुत अधिक हेवीवेट होगा? मैं जानना बहुत दिलचस्पी रखने के लिए अपेक्षाकृत नया हूं। :) – Dennis

+0

1. हां मोक्स अधिक हेवीवेट हैं और अपेक्षित विधि कॉल कॉन्फ़िगर की जानी चाहिए। 2. परीक्षण केवल तभी विफल होगा जब लॉगिंग स्तर सत्यापन का हिस्सा था। यदि आप एक त्रुटि संदेश की अपेक्षा करते हैं और यह विफल हो जाएगा तो यह एक जानकारी थी। यदि आप किसी भी स्तर पर एक संदेश की उम्मीद करते हैं तो यह असफल नहीं होगा। –

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