2014-04-23 20 views
18

Test edilmesi gereken bir A sınıfına sahibim. Bazı veriler, manipüle veritabanından alınan edilecek dateTime değerine göreBir yöntemin yerel değişkenini alay etmek için Mockito kullanma

public class A { 
    public void methodOne(int argument) { 
     //some operations 
     methodTwo(int argument); 
     //some operations 
    } 

    private void methodTwo(int argument) { 
     DateTime dateTime = new DateTime(); 
     //use dateTime to perform some operations 
    } 
} 

ve: Aşağıdaki A tanımıdır. Bu veritabanı için, değerler bir JSON dosyası aracılığıyla devam eder.

Bu, işleri karmaşıklaştırır. İhtiyacım olan şey, test edilirken dateTime'u belirli bir tarihe ayarlamaktır. Mockito kullanarak yerel bir değişkenin değeriyle uğraşmanın bir yolu var mı?

+0

[Mockito ile yerel kapsam nesnelerinin alay yöntemleri] olası kopyası (http://stackoverflow.com/questions/6520242/mocking-methods-of-local-scope-objects-with-mockito) – zubergu

+0

Diğerleri Bu konuda bulduğum sorular ekstra soyutlama katmanına sahipti. Dahası, çoğunluğu yerel değişkeni alay edilmiş sınıfın bir yöntemi aracılığıyla başlatmıştır. – user657592

cevap

18

Yerel bir değişkenle dalga geçemezsiniz.

public class A { 
    public void methodOne(int argument) { 
    //some operations 
    methodTwo(int argument); 
    //some operations 
    } 

    private void methodTwo(int argument) { 
    DateTime dateTime = createDateTime(); 
    //use dateTime to perform some operations 
    } 

    protected DateTime createDateTime() { 
    return new DateTime(); 
    } 
} 

public class ATest { 
    @Test 
    public void testMethodOne() { 
    DateTime dt = new DateTime (/* some known parameters... */); 
    A a = Mockito.spy(new A()); 
    doReturn(dt).when(a).createDateTime(); 
    int arg = 0; // Or some meaningful value... 
    a.methodOne(arg); 
    // assert the result 
} 
+6

Korumalı bir createDateTime() yöntemi yazmak istemiyorum. Bununla ilgili başka bir yol yok mu? – user657592

+0

Aslında Mockito.doReturn (dt) .when (a) .createDateTime() kullanmak zorundasınız. Bkz. Https://stackoverflow.com/questions/11620103/mockito-trying-to-spy-on-method-is-calling -the-orijinal yöntem – Alex

+1

Bu elbette @Alex doğru, fark ettiğiniz için teşekkürler! Düzenlendi ve düzeltildi. – Mureinik

2

böyle bir sorunla başa çıkmak için en iyi yolu DateTime yeni örneklerini almak için kullanılan bir enjekte Clock hizmeti kullanmaktır: Yapabileceğin Ne Ancak, protected yönteme onun yaratma ayıklamak ve spy olduğunu . Bu şekilde, testiniz, geçerli saat yerine belirli bir DateTime döndüren sahte bir Saat'i enjekte edebilir.

Yeni Java 8 zaman API'sinin özellikle bu amaç için Clock class'u tanımladığını unutmayın.

+0

Bu bir jdk1.8 gerektirir, değil mi? Şu anda 1,7 yaşıyorum ve yakında herhangi bir zamanda yükseltmeyi planlamıyorum. – user657592

+1

Hayır. Sadece kendi Saat sınıfınızı veya arayüzünüzü tanımlamanız ve mevcut saati elde etmek için 'yeni DateTime()' yerine 'clock.newDateTime()' işlevini çağırmanız yeterlidir. –