2011-11-25 19 views
6

मेरे पास एक वसंत बीन है जिसमें लॉगर सदस्य है और मैं कुछ क्रियाओं को लॉग करने के लिए उस लॉगर का उपयोग करता हूं।
इसके अलावा मैंने एक टेस्ट केस लिखा है जो SpringJUnit4ClassRunner का उपयोग करता है। मैं एक गुण फ़ाइल के साथ log4j कॉन्फ़िगर किया है और प्रत्येक परीक्षा मामले में मैं इन गुणों के साथ लकड़हारा प्रारंभ:जुनीट टेस्ट केस में लॉग 4j

@BeforeClass 
public static void init() { 
    PropertyConfigurator.configure("src/com/config/log4j.properties"); 
} 

जब मैं एक परीक्षण चलाने यह मेरे लिए एक चेतावनी देता है

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

हालांकि, में लकड़हारा मेरा बीन log4j.properties में निर्दिष्ट स्थान में संदेश लिखता है, यानी यह ठीक काम करता है। log4j मुझे ऐसी चेतावनियां क्यों देता है?

+0

जिस तरह से आप '-Dlog4j.configuration = com/config/log4j.properties' को JVM में पास कर सकते हैं। आपके द्वारा वर्णित कोड हटाया जा सकता है। –

उत्तर

5

मुझे लगता है कि कारण SpringJUnit4ClassRunner में इस कोड है

public SpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    if (logger.isDebugEnabled()) { 
     logger.debug("SpringJUnit4ClassRunner constructor called with [" + clazz + "]."); 
    } 
    this.testContextManager = createTestContextManager(clazz); 
} 

आप log4j के बारे में चेतावनी देखते हैं, बस @DN के रूप में करते हैं log4j.properties आपके आवेदन वर्ग पथ के लिए फ़ाइल जोड़ने का सुझाव दिया, में नहीं चाहते हैं यदि आप मैवेन निर्देशिका संरचना का उपयोग करते हैं तो log4j.properties फ़ाइल (src/main/संसाधन) में जोड़ें जो चेतावनी को खत्म कर देगा।

2

क्योंकि Runner लॉग 4J प्रारंभ होने से पहले रन निष्पादित करता है।

+0

क्या SpringJUnit4ClassRunner को Log4j की आवश्यकता है? यदि हाँ, मैं रनर निष्पादन से पहले इसे कैसे कॉन्फ़िगर कर सकता हूं? – maks

+0

@maks यह सुनिश्चित नहीं है कि यह आवश्यक है या यदि यह लॉग रैपर का उपयोग करता है। क्लासपाथ रूट पर 'log4j.properties' होने के बाद पर्याप्त होना चाहिए, हालांकि आपको इसे आजमा देना होगा। –

+0

@maks कॉमन्स वास्तव में लॉगिंग, लेकिन सलाह अभी भी लागू होती है। –

11

मैं यूनिट परीक्षण & उत्पादन के साथ विभिन्न लॉगिंग का उपयोग करने के लिए डिफ़ॉल्ट logpath से अपना log4j कॉन्फ़िगरेशन रखना चाहता था। मैंने SpringJUnit4ClassRunner subclassing और एक स्थिर वर्ग प्रारंभकर्ता का उपयोग करके इसके आसपास काम किया।

// The new test runner 
public class JUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
    try { 
     Log4jConfigurer.initLogging("classpath:test/log4jconfig.xml"); 
    } 
    catch(FileNotFoundException ex) { 
     System.err.println("Cannot Initialize log4j"); 
    } 
    } 

    public JUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    } 
} 

टेस्ट करने के लिए परिवर्तित करें:

@RunWith(JUnit4ClassRunner.class) 
@ContextConfiguration 
@TransactionConfiguration 
@Transactional 
public class LmpDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests { 
... 

अब log4j से पहले वसंत परीक्षण धावक शुरू हो जाती है कॉन्फ़िगर किया गया है।

+0

आप इसे अपने पैकेज संरचना में कहां रखते हैं? –

+0

मैं इसे एक अलग परियोजना में रखता हूं (जिसके परिणामस्वरूप एक अलग जार होता है)। इस तरह से मैं परियोजनाओं के बीच टेस्ट रनर क्लास का पुन: उपयोग कर सकता हूं। इसलिए, विशिष्ट पैकेज अप्रासंगिक है, सिवाय इसके कि यह टेस्ट क्लास के कक्षा के भीतर होना चाहिए। – wbdarby

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