2016-08-09 9 views
7

मैं इस तरह एक वर्ग foo के साथ एक जावा 8 एप्लिकेशन हैJUnit परीक्षण लॉग बयान

public class FooTest { 
    private Foo foo; 

    @Before 
    public void setUp() throws Exception { 
     foo = new Foo(); 
    } 

    @Test 
    public void testSomething() { 
     String result = foo.something(); 
     assertEquals(result,"test"); 
    } 
} 

मेरा उद्देश्य एक टेस्ट केस लिखना है जो something विधि के रिटर्न वैल्यू और लॉगिंग स्टेटमेंट को सुनिश्चित करने के लिए लॉगिंग स्टेटमेंट का परीक्षण करता है। लॉगिंग स्टेटमेंट का परीक्षण करने के लिए जूनिट को कैसे सेट अप करना है, यह जानने के लिए मैंने वेब पर घंटों बिताए हैं। मैंने this, this, this और this विधि का कोई फायदा नहीं लिया है।

मुझे नहीं पता कि यह कुछ है जो मैं गलत कर रहा हूं या क्या। लेकिन यहाँ मेरी कोड पिछले उदाहरण के आधार पर दिया गया है:

public class FooTest { 
    private Foo foo; 
    @Mock private Appender appender; 
    @Captor private ArgumentCaptor captor; 

    @Before 
    public void setUp() throws Exception { 
     foo = new Foo(); 
     MockitoAnnotations.initMocks(this); 
     Logger.getRootLogger().addAppender(appender); 
    } 

    @After 
    public void tearDown() throws Exception { 
     Logger.getRootLogger().removeAllAppenders(); 
    } 

    @Test 
    public void testSomething() { 
     String result = foo.something(); 
     assertEquals(result,"test"); 
     verify(appender).doAppend(((LoggingEvent) captor.capture())); 
     LoggingEvent loggingEvent = (LoggingEvent) captor.getValue(); 
     assertEquals(loggingEvent.getRenderedMessage(), "doing foo test"); 
    } 
} 

लेकिन मैं निम्नलिखित त्रुटि मिलती है जब मैं इस चलाएँ:

Wanted but not invoked: 
appender.doAppend(<Capturing argument>); 
-> at <package>.testSomething(FooTest.java:22) 
Actually, there were zero interactions with this mock. 

वहाँ एक आसान तरीका पूरा करने के लिए जो मैं चाहता है? यदि यह सबसे अच्छा तरीका है तो मैं गलत क्या कर रहा हूं?

+1

संकेत। आपकी समस्या ** नया ** कथन है जो आपके कोड में स्थान लेता है। आप यहां http://stackoverflow.com/questions/38863913/how-to-unit-test-log-e-in-android को समझ सकते हैं कि स्थिर तरीके से कॉल से कैसे छुटकारा पाएं या अपने मामले में नया। और: यह समझने के लिए कि क्यों ** नया ** समस्याएं देता है, आप कुछ वीडियो देखना चाहेंगे: https://www.youtube.com/playlist?list=PLD0011D00849E1B79 ... गंभीरता से: हर मिनट आपके समय के लायक है। – GhostCat

+0

Foo में लॉगर है जो आपके लॉगर का परीक्षण करने के तरीके से लिखा या कार्यान्वित नहीं किया गया है। आप बस नए फू का आह्वान करते हैं, जहां उस बिंदु पर foo का अपना लॉगर आगे – kuhajeyan

+1

संभावित डुप्लिकेट [लॉगर में किसी संदेश पर जुनीट कैसे करें] (http://stackoverflow.com/questions/1827677/how-to क्या, एक JUnit-ज़ोर-ऑन-ए-संदेश में एक-लकड़हारा) – IanEdington

उत्तर

6

ज़रूर!

  • अन्य सभी प्रवेश करने के अलावा इस appender के लिए लॉग इन करने के परीक्षण लकड़हारा विन्यास में स्मृति अपने स्वयं के कस्टम सिंगलटन Appender वर्ग
  • बनाएं संशोधित आप इसे प्रत्येक परीक्षण के दौरान
  • clear() करेंगे @Begin
  • टेस्ट खत्म होने से पहले इसे सामान्य रूप से जोर दें।

वास्तव में, एसएलएफ 4 जे में पहले से ही an implementation है जिसे आप देख सकते हैं।

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