2013-07-19 14 views
11

Come posso prendere in giro con Mockito altre classi della mia classe che sono in prova?Classe Mock in prova

Ad esempio:

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

e test:

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

Posso spoof AnythingPerformerClass f o escludendo la logica non necessaria da AnythingPerformerClass? Posso eseguire l'override del metodo doSomething() per la restituzione semplice true o false?

Perché specificare Mockito, perché ne ho bisogno per i test Android con Robolectric.

+0

Perché istanziate un'istanza della classe per ogni chiamata di metodo? Ciò sembra seriamente eccessivo – fge

risposta

12

Si potrebbe refactoring MyClass in modo che utilizzi dependency injection. Invece di avere esso creare un'istanza AnythingPerformerClass si poteva passare in un'istanza della classe al costruttore di MyClass in questo modo:

class MyClass { 

    private final AnythingPerformerClass clazz; 

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

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

È quindi possibile passare nella implementazione mock nel test di unità

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

In alternativa, se lo stato AnythingPerformerClass contiene stato, è possibile passare un AnythingPerformerClassBuilder al costruttore.

+0

Secondo i [documenti di Mockito] (http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#2), il valore di ritorno predefinito per un 'booleano' primitivo sarà 'false', quindi questo test case fallisce. – mthmulders

+0

Bene, ho omesso il punto in cui la chiamata al metodo è stata presa in giro. L'OP dice "Posso sovrascrivere il metodo doSomething() per un semplice ritorno vero o falso?" Quindi non penso che dovrei limitare il codice. – cyon

1

È possibile impostare cosa restituire in Mockito.

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

come è attualmente (sia dichiarazione e istanziazione della AnythingPerformerClass all'interno di un metodo, non è possibile giro il AnythingPerformerClass utilizzando solo Mockito.

Se possibile, spostare sia la dichiarazione e istanziazione di AnythingPerformerClass al livello di classe: dichiarare una variabile di tipo AnythingPerformerClass esempio e farlo un'istanza dal costruttore

questo modo, si potrebbe più facilmente iniettare una finta di AnythingPerformerClass durante il test, e specificare il suo comportamento ad es.. ampia:

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

o per testare la gestione degli errori:

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