2010-05-11 23 views
9

Bir dosya değiştiyse her 2 saniyede bir kontrol eden çok basit bir dosya izleyici sınıfım var ve eğer öyleyse, onChange yöntemi (void) çağrılıyor. onChange yönteminin bir birim testinde çağrıldığını kontrol etmenin kolay bir yolu var mı?JUnit: geçersiz bir yöntemin çağrıldığını kontrol etme

kodu:

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"); 
    } 
} 

Testi:

@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(); 
} 

cevap

16

Mockito ile, bir yöntem en az bir kez/asla denir olmadığını doğrulayabilirsiniz.

this page

örn noktası 4 Bkz:

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

Sadece mockito'yu değil, herhangi bir alay çerçevesini kullanabilirsiniz. EasyMock veya jMock'a bir göz atın ve ne istediğinizi seçin. Yazı birimi testlerinin başparmak kuralı, sadece kontrol edebileceğiniz nesneleri alaymanız gerektiğidir. Diğer bir deyişle, sahte nesneler, test altındaki yönteme yapıcı argümanları/ayarlayıcıları veya parametreleri kullanılarak test edilen sınıfa sunulmalıdır. Bu mantıkla, test edilen sınıfın yönteminde oluşturulan statik, final veya özel veya "yeni" nesneleri taklit edemezsiniz. – Kartik

+0

EasyMock'te nasıl yapabileceğiniz hakkında bir fikriniz var mı? Bu konuda eksik belgeleri buluyorum. Böyle bir PropertyFileWatcher için bir alay oluştururken: PropertyFileWatcher propertyFileWatcher = createMockBuilder (PropertyFileWatcher.class) .withConstructor (dosya) .createMock(); ve beklenen çağrıyı onChange'a kaydedin ve tekrar oynatın: propertyFileWatcher.onChange (dosya); tekrar (propertyFileWatcher); onChnage yöntemi hemen çağrılır ve bilgi sysout'a yazdırılır, ancak sadece bu yöntemin çağrıldığını doğrulamak isterim – nkr1pt

+0

AtomicBoolean çözümünü kullanabilmek için mockito kullanmayın. –

4

, senin PropertyFileWatcher sınıflandırma çıkartılacaktır. Öyleyse, neden bu şekilde alt sınıf olarak değil:

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

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

Testiniz için basit bir değişiklik.

@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

Bu çözümü gerçekten seviyorum çünkü alaycı bir çerçeveye bağımlılık eklemiyor; Bununla birlikte, alay çerçeveler, birim testi için bir zorunluluktur; Bu yüzden alaycı öneriyi, sorumu kabul ettiğim cevap olarak kabul ediyorum. – nkr1pt

+0

@ nkr1pt. Kesinlikle saygın bir alay çerçeve ile gidin. JDK'nın 1.4 sürümü ile sınırlı değilseniz, jMock'a bir göz atın. –

İlgili konular