2012-01-06 15 views
23

Voglio testare alcuni metodi che chiamano altri nella stessa classe. Fondamentalmente è lo stesso metodo, ma con meno argomenti perché ci sono alcuni valori predefiniti in un database. Mostro su questoCome verificare se il metodo è stato chiamato da altri con la stessa classe di mockito

public class A{ 
    Integer quantity; 
    Integer price;   

    A(Integer q, Integer v){ 
     this quantity = q; 
     this.price = p; 
    } 

    public Float getPriceForOne(){ 
     return price/quantity; 
    } 

    public Float getPrice(int quantity){ 
     return getPriceForOne()*quantity; 
    } 
} 

quindi voglio test se è stato chiamato il metodo getPriceForOne() quando si chiama il metodo getPrice (int). In pratica chiamate il metodo normale getPrice (int) e mock getPriceForOne.

import static org.mockito.Mockito.times; 
import static org.mockito.Mockito.verify; 
.... 

public class MyTests { 
    A mockedA = createMockA(); 

    @Test 
    public void getPriceTest(){ 
     A a = new A(3,15); 
     ... test logic of method without mock ... 

     mockedA.getPrice(2); 
     verify(mockedA, times(1)).getPriceForOne(); 
    } 
} 

Considerate che ho molto più complicato di file questo è un programma di utilità per gli altri e deve essere tutto in un unico file.

+0

Quello che vuoi è beffardo parziale, ma non è consigliato, in realtà Mockito scoraggiare questo ad eccezione di alcuni casi specifici. Se si tratta di una classe di utilità, ha senso testare completamente tutti i metodi. Se non lo è, cioè richiede un'elaborazione complessa, potresti invece progettare il codice con la composizione. – Brice

risposta

38

Si avrebbe bisogno di una spia, non un finto A:

A a = Mockito.spy(new A(1,1)); 
    a.getPrice(2); 
    verify(a, times(1)).getPriceForOne(); 
+0

Che cosa è ** getPriceForOne ** dovrebbe avere alcuni parametri arbitrari? –

+0

quindi aggiungete 'any (YourObject.class)' come parametro per 'getPriceForOne' – TormundThunderfist

+0

Ciò è corretto. Allo stesso tempo, se la classe 'spyed' ha variabili private da impostare, anche queste devono essere impostate su quella classe usando il metodo Whitebox.setInternalState(). – udayanga

Problemi correlati