2010-05-11 19 views
9

कहा जाता है तो जांच कर रहा है मेरे पास एक बहुत ही सरल फ़ाइल वॉचर क्लास है जो फ़ाइल बदलती है और यदि ऐसा है, तो onChange विधि (शून्य) कहा जाता है। क्या यह जांचने का कोई आसान तरीका है कि onChange विधि को यूनिट परीक्षण में बुलाया जा रहा है?जुनीट: यदि एक शून्य विधि को

कोड:

public class PropertyFileWatcher extends TimerTask { 
    private long timeStamp; 
    private File file; 

    public PropertyFileWatcher(File file) { 
     this.file = file; 
     this.timeStamp = file.lastModified(); 
    } 

    public final void run() { 
     long timeStamp = file.lastModified(); 

     if (this.timeStamp != timeStamp) { 
      this.timeStamp = timeStamp; 
      onChange(file); 
     } 
    } 

    protected void onChange(File file) { 
     System.out.println("Property file has changed"); 
    } 
} 

टेस्ट:

@Test 
public void testPropertyFileWatcher() throws Exception { 
    File file = new File("testfile"); 
    file.createNewFile(); 
    PropertyFileWatcher propertyFileWatcher = new PropertyFileWatcher(file); 

    Timer timer = new Timer(); 
    timer.schedule(propertyFileWatcher, 2000); 

    FileWriter fw = new FileWriter(file); 
    fw.write("blah"); 
    fw.close(); 

    Thread.sleep(8000); 
    // check if propertyFileWatcher.onChange was called 

    file.delete(); 
} 

उत्तर

16

Mockito के साथ, आप सत्यापित कर सकते हैं कि क्या एक विधि में कम से कम एक बार/कभी नहीं कहा जाता है।

this page

जैसे में बिंदु 4 देखें:

verify(mockedObject, times(1)).onChange(); // times(1) is the default and can be omitted 
+0

आप किसी भी मॉकिंग फ्रेमवर्क का उपयोग कर सकते हैं न कि सिर्फ मॉकिटो। EasyMock या jMock पर एक नज़र डालें और अपनी पसंद के अनुसार चुनें। लेखन इकाई परीक्षण के अंगूठे का नियम यह है कि आपको केवल उन वस्तुओं को नकल करना चाहिए जिन्हें आप नियंत्रित कर सकते हैं। दूसरे शब्दों में, नकली वस्तुओं को परीक्षण के तहत अपनी विधि के लिए कन्स्ट्रक्टर तर्क/सेटर्स या पैरामीटर का उपयोग करके परीक्षण के तहत कक्षा में उपलब्ध कराया जाना चाहिए। इस तर्क से, आप परीक्षण के तहत कक्षा के तरीके के अंदर बनाए गए स्थिर आक्रमण, अंतिम या निजी, या "नई" वस्तुओं का नकल नहीं कर सकते हैं। – Kartik

+0

कोई विचार है कि आप इसे EasyMock में कैसे कर सकते हैं? मुझे इस पर कमी की प्रलेखन मिलती है। जब मैं इस तरह PropertyFileWatcher के लिए एक नकली बना देता हूं: PropertyFileWatcher propertyFileWatcher = createMockBuilder (PropertyFileWatcher.class) .withConstructor (file) .createMock(); और अपेक्षित कॉल को चालू करें और फिर से चलाएं: propertyFileWatcher.onChange (फ़ाइल); पुनरावृत्ति (propertyFileWatcher); onChnage विधि को तुरंत कॉल किया जाता है और जानकारी sysout पर मुद्रित होती है, लेकिन मैं यह सत्यापित करना चाहूंगा कि अगर विधि को कॉल किया गया था या नहीं – nkr1pt

+0

परमाणु Boolean समाधान करने में सक्षम mockito का उपयोग न करें। –

4

मैं समझता हूँ के रूप में, अपने PropertyFileWatcher subclassed करने के लिए है। तो, इसे इस तरह उपclass क्यों नहीं:

class TestPropertyFileWatcher extends PropertyFileWatcher 
{ 
    boolean called = false; 
    protected void onChange(File file) { 
     called = true; 
    } 
} 

... 
TestPropertyFileWatcher watcher = new TestPropertyFileWatcher 
... 
assertTrue(watcher.called); 
7

यहां आपके परीक्षण के लिए एक सरल संशोधन है।

@Test 
public void testPropertyFileWatcher() throws Exception { 
    final File file = new File("testfile"); 
    file.createNewFile(); 

    final AtomicBoolean hasCalled = new AtomicBoolean(); 
    PropertyFileWatcher propertyFileWatcher = 
     new PropertyFileWatcher(file) 
     { 
     protected void onChange (final File localFile) 
     { 
      hasCalled.set(true); 
      assertEquals(file, localFile); 
     } 
     } 


    Timer timer = new Timer(); 
    timer.schedule(propertyFileWatcher, 2000); 

    FileWriter fw = new FileWriter(file); 
    fw.write("blah"); 
    fw.close(); 

    Thread.sleep(8000); 
    // check if propertyFileWatcher.onChange was called 

    assertTrue(hasCalled.get()); 
    file.delete(); 
} 
+0

मुझे वास्तव में यह समाधान पसंद है क्योंकि यह एक मॉकिंग फ्रेमवर्क पर निर्भरता नहीं जोड़ता है; हालांकि मॉकिंग फ्रेमवर्क यूनिट परीक्षण के लिए एक आवश्यकता है; यही कारण है कि मैं अपने प्रश्न के स्वीकृत उत्तर के रूप में मजाकिया सुझाव स्वीकार कर रहा हूं। – nkr1pt

+0

@ nkr1pt। निश्चित रूप से एक प्रतिष्ठित मॉकिंग ढांचे के साथ जाओ। यदि आप जेडीके के 1.4 संस्करण तक सीमित नहीं हैं, तो jmock पर एक नज़र डालें। –

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