2012-01-06 18 views
23

Quiero probar algunos métodos que llaman a otros en la misma clase. Básicamente es el mismo método, pero con menos argumentos porque hay algunos valores predeterminados en una base de datos. Muestro en estaCómo verificar si el método fue llamado desde otro con la misma clase por 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; 
    } 
} 

Así que quiero probar si fue llamado método getPriceForOne() al llamar método getPrice (int). Básicamente llame al método normal getPrice (int) y simula 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(); 
    } 
} 

Considere tengo mucho más complicada de archivos eso es una utilidad para los demás y debe ser todo en un solo archivo.

+0

Lo que queremos es burla parcial, pero no se recomienda, Mockito realidad desalentar esto a excepción de algunos casos específicos. Si se trata de una clase de utilidad, tiene sentido simplemente probar completamente cada método. Si no es así, es decir, requiere un procesamiento complejo, es posible que desee diseñar su código con la composición en su lugar. – Brice

Respuesta

38

Se necesitaría un espía, no un simulacro Una:

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

¿Qué se supone que ** getPriceForOne ** tiene algunos parámetros arbitrarios? –

+0

luego solo agrega 'any (YourObject.class)' como parámetro para 'getPriceForOne' – TormundThunderfist

+0

Haciendo esto es correcto. Al mismo tiempo, si su clase 'espía' tiene variables privadas para establecer, también deben establecerse en esa clase utilizando el método Whitebox.setInternalState(). – udayanga

Cuestiones relacionadas