2016-03-19 18 views
1

MyClass adlı bir dersim var. Bu sınıfta bir metodum var, public int getSpacing().Mockito'yu kullanarak, bir örnek yönteminin bir döndürme değerini o sınıfın bir örneğini almadan nasıl atabilirim?

Farklı bir sınıftan bir yöntemi test ediyorum. public static ArrayList<SpecialObject> getSpecialObjects(). MyClass'un bir örneğindeki getSpecialObjects()getSpacing() numaralı çağrıları. Mockito ile bir test yaptığımda bu yöntemin her zaman 0 olmasını istiyorum. Bunu nasıl yapabilirim? Bulduğum tüm örnekler, bir yöntemle uğraşmadan önce belirli bir nesne örneğini gerektirir.

Nasıl yapılacağını biliyorum. örnekleri getSpecialObjects() dinamik olarak oluşturulan çünkü

MyClass myInstance = new MyClass();   
Mockito.when(myInstance.getSpacing()).thenReturn(0); 

Ancak, ben, MyClass TÜM örnekleri için getSpacing() davranışını geçersiz kılmak istiyorum. Bunu nasıl yapabilirim?

Söylemek istediğim budur ama nasıl olduğunu bilmiyorum.

Mockito.when((Any instance of MyClass).getSpacing()).thenReturn(0); 
+0

'myInstance' başlatılması gerekiyor. Kodunuzu gösterebilir mi? –

+0

@JaredBurrows Örneği düzelttim. Bu benim kodun aşağılık bir sürümü. Sorunum, örneğe erişimim olmaması, tüm örneklerin davranışını geçersiz kılmaktır. –

+0

Bunun mümkün olduğunu düşünmüyorum, ihtiyacın olan yere alay edilebilecek bir şey enjekte edebilir misin? –

cevap

1

Unutmayın, bunu açıkladığınız gibi Mockito'da yapamazsınız. Mockito, MyClass türünün tüm nesnelerini kontrol etmez, bunun yerine'u kontrol edebilmeniz için bir proxy alt sınıfı oluşturmayı ve sunmayı çok kolaylaştırır. Bu nedenle Mockito, sınıfları ve yöntemleri kesin olmayan bir şekilde sayar ve neden tüm örneklerin davranışlarını etkilemek için Mockito'yu kullanamayacaksınızdır.

Ayrıca bakınız:How to use Mockito when we cannot pass a mock object to an instance of a class

Bir geçici çözüm kütüphaneleri geçmektir: As Slava describes, onlar dönebilirsiniz böylece new MyClass() yapıcı çağrıları yerine içeren baytkod değiştiren özel bir classloader sahiptir PowerMock kullanabilirler senin bunun yerine alay eder.

Alternatif olarak, sınamanızı kolaylaştırmak için sınıfınızı yeniden yapılandırabilirsiniz. Tamamen bağımlılık enjeksiyon için sınıf yapılandırılması ve Provider<MyClass> enjekte fakat faydaların çoğu ile daha yerel çözüm var olabilir:

public class ClassThatConsumesMyClass { 
    /** Visible for testing. Override to customize MyClass instances. */ 
    MyClass createMyClass() { 
    return new MyClass(); 
    } 

    public ReturnValue getSpecialObjects(int n) { 
    for (int i = 0; i < n; i++) { 
     // Instead of calling "new MyClass()", call your method. 
     MyClass myClassInstance = createMyClass(); 
     // ... 
    } 
    // ... 
    } 
} 

public class TestForClassThatConsumesMyClass { 
    ClassThatConsumesMyClass consumer; 

    @Before public void createMyClass() { 
    consumer = new ClassThatConsumesMyClass() { 
     @Override MyClass createMyClass() { 
     MyClass myInstance = Mockito.mock(MyClass.class); 
     Mockito.when(myInstance.getSpacing()).thenReturn(0); 
     return myInstance; 
     } 
    } 
    } 

    // Test as usual, now that you've mocked every newly-created 
    // instance of MyClass in your consumer. 
} 
1

Öyle gibi MyClass yapıcı kullanılarak powermock alay edebilirsiniz:

MyClass myClassSpy = spy(new MyClass()); 
whenNew(MyClass.class).withAnyArguments().thenReturn(myclassSpy); 

O zaman casus olağan geçersiz kılmaları kullanarak bu yöntemden ne isterseniz dönebilirsiniz. MyClass