इन (आश्चर्यजनक रूप से) त्वरित और सहायक उत्तरों के लिए बहुत बहुत धन्यवाद; उन्होंने मुझे मेरे समाधान के लिए सही रास्ते पर रखा।
कोडबेस मैं इसका उपयोग करना चाहता था, इसके लकड़हारे तंत्र के रूप में java.util.log का उपयोग करता है, और मैं उन कोडों को पूरी तरह से बदलने के लिए या logger इंटरफेस / facades के लिए पूरी तरह से बदलने के लिए उन कोड में पर्याप्त घर पर महसूस नहीं करता हूं। लेकिन इन सुझावों के आधार पर, मैंने एक जूलहैंडलर एक्सटेंशन 'हैक-अप' किया और यह एक उपचार के रूप में काम करता है।
एक संक्षिप्त सारांश इस प्रकार है। बढ़ाएँ java.util.logging.Handler
:
class LogHandler extends Handler
{
Level lastLevel = Level.FINEST;
public Level checkLevel() {
return lastLevel;
}
public void publish(LogRecord record) {
lastLevel = record.getLevel();
}
public void close(){}
public void flush(){}
}
जाहिर है, आप जितना चाहें उतना स्टोर कर सकते हैं LogRecord
, या एक ओवरफ्लो होने तक उन सभी को स्टैक में धकेल सकते हैं।
जूनट-टेस्ट की तैयारी में, आप एक बनाते हैं java.util.logging.Logger
और उसमें एक नया जोड़ते हैं LogHandler
:
@Test tester() {
Logger logger = Logger.getLogger("my junit-test logger");
LogHandler handler = new LogHandler();
handler.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
setUseParentHandlers()
सामान्य हैंडलर को चुप करने के लिए कॉल करना है, ताकि (इस जूनियर-टेस्ट रन के लिए) कोई अनावश्यक लॉगिंग न हो। इस लकड़हारा का उपयोग करने के लिए आपके कोड-अंडर-टेस्ट को जो भी करना है, परीक्षण और मुखरता चलाएँ:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(बेशक, आप इस काम के बड़े हिस्से को एक @Before
विधि में बदल देंगे और अन्य सुधार कर देंगे, लेकिन यह इस प्रस्तुति को अव्यवस्थित कर देगा)।
logger.getAllAppenders()
, फिरappender.setThreshold(Level.OFF)
प्रत्येक पर कॉल करना और कॉल करना (और जब आप काम पूरा कर लें तो उन्हें रीसेट कर दें!)। यह सुनिश्चित करता है कि आपके द्वारा उत्पन्न "बुरे" संदेश परीक्षण लॉग में दिखाई नहीं देते हैं और अगले डेवलपर को फ्रीक करते हैं।