2013-07-19 18 views
11

Wie kann ich mit Mockito andere Klassen in meiner Klasse, die im Test ist, verspotten?Mock-Klasse im Test

Zum Beispiel:

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

Und Test:

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

Kann ich fälschen AnythingPerformerClass f oder unnötige Logik von AnythingPerformerClass auszuschließen? Kann ich doSomething() Methode für einfache Rückkehr true oder false überschreiben?

Warum ich Mockito angeben, weil ich es für Android-Tests mit Robolectric brauche.

+0

Warum instanziieren Sie eine Instanz der Klasse für jeden Methodenaufruf? Das sieht ernsthaft übertrieben aus – fge

Antwort

12

Sie MyClass Refactoring könnte, so dass es dependency injection verwendet. Anstatt es eine AnythingPerformerClass Instanz erstellen Sie in einer Instanz der Klasse an den Konstruktor MyClass wie so passieren könnte:

class MyClass { 

    private final AnythingPerformerClass clazz; 

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

    public boolean performAnything() {   
    return clazz.doSomething();   
    } 
} 

Sie dann in der Mock-Implementierung in der Unit-Test passieren kann

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

Wenn Ihr AnythingPerformerClass Status enthält, können Sie alternativ einen AnythingPerformerClassBuilder an den Konstruktor übergeben.

+0

Laut den [Mockito docs] (http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#2) wird der Standard-Rückgabewert für ein primitives 'boolean' sein "falsch", so dass dieser Testfall fehlschlägt. – mthmulders

+0

Nun, ich habe den Schritt weggelassen, in dem der Methodenaufruf verspottet wird. Das OP sagt "Kann ich doSomething() Methode überschreiben für einfache Rückkehr wahr oder falsch?" Ich denke also nicht, dass ich den Code einschränken sollte. – cyon

1

Sie können festlegen, was in Mockito zurückgegeben werden soll.

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

Wie es derzeit ist (beide Deklaration und Instantiierung der AnythingPerformerClass innerhalb einer Methode ist es nicht möglich, die AnythingPerformerClass zu verspotten nur Mockito verwenden.

Wenn möglich, verschieben sowohl die Deklaration und die Instanziierung von AnythingPerformerClass auf Klassenebene: deklarieren Sie eine Instanzvariable vom Typ AnythingPerformerClass und lassen Sie sie vom Konstruktor instanziieren

Auf diese Weise können Sie während des Tests leichter einen Mock von AnythingPerformerClass injizieren und dessen Verhalten angeben reichlich:

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

oder Fehlerbehandlung zu testen:

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