2013-07-19 29 views
11

Sınıfımdaki diğer derslerle Mockito'yu nasıl test edebilirim?Test edilen sınıfta mock sınıfı

MyClass.java

class MyClass { 
    public boolean performAnything() { 
     AnythingPerformerClass clazz = new AnythingPerformerClass(); 
     return clazz.doSomething();   
    } 
} 

AnythingPerformerClass.java

class AnythingPerformerClass { 
    public boolean doSomething() { 
     //very very complex logic 
     return result; 
    } 
} 

Ve testin: Örneğin

@Test 
public void testPerformAnything() throws Exception { 
    MyClass clazz = new MyClass(); 
    Assert.assertTrue(clazz.performAnything()); 
} 

Ben AnythingPerformerClass f taklit edebilir veya AnythingPerformerClass'dan gereksiz mantık hariç mi? true veya false basit dönüş için doSomething() yöntemini geçersiz kılabilir miyim?

Neden Mockito'yu belirtiyorum, çünkü Robolectric ile Android testi için buna ihtiyacım var.

+0

Her yöntem çağrısında sınıfın bir örneğini neden örneklendirirsiniz? Ciddi bir şekilde overkill – fge

cevap

12

Bunu dependency injection kullanması için MyClass planı ayrı olabilir. Bunun yerine bir AnythingPerformerClass örneğini oluşturmak zorunda bunu gibi MyClass kurucusuna sınıfının bir örneği de geçebileceği:

class MyClass { 

    private final AnythingPerformerClass clazz; 

    MyClass(AnythingPerformerClass clazz) { 
     this.clazz = clazz; 
    } 

    public boolean performAnything() {   
    return clazz.doSomething();   
    } 
} 
Daha sonra birim testinde sahte uygulanmasında geçebilir

@Test 
public void testPerformAnything() throws Exception { 
    AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class); 
    MyClass clazz = new MyClass(mockedPerformer); 
    ... 
} 

Alternatif olarak, AnythingPerformerClass durumunuz varsa, o zaman yapıcıya bir AnythingPerformerClassBuilder geçirebilirsiniz.

+0

görünüyor [Mockito docs] 'a göre (http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#2), ilkel bir' boolean 'için varsayılan dönüş değeri 'false', bu yüzden bu test durumu başarısız. – mthmulders

+0

Eh, yöntem çağrısının alay edildiği adımı atladım. OP, "Doğru getiri veya yanlış için" doSomething() yöntemini geçersiz kılabilir miyim? " Bu yüzden kodu kısıtlamam gerektiğini düşünmüyorum. – cyon

1

Mockito'da ne döneceğini ayarlayabilirsiniz. şu anda (hem beyan ve yöntem içinde AnythingPerformerClass örneğinin olduğu gibi

when(mock.method()).thenReturn(someValue) 
3

, sadece mockito kullanarak AnythingPerformerClass alay etmek mümkün değildir.

Mümkünse beyanı ve AnythingPerformerClass örneğinin hem hareket sınıf düzeyine: tip AnythingPerformerClass örneğidir değişken bildirmek ve yapıcı tarafından örneği var

bu şekilde, daha kolay test sırasında AnythingPerformerClass bir taklidini enjekte ve davranışını belirtebilirsiniz için eski.. bol:

when(anythingPerformerClassMock.doSomething()).thenReturn(true); 

veya hata işleme sınamak için:

when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException());