2012-02-23 12 views
5

Hola, estoy luchando con un problema simple.JUnit Método de prueba que usa otros métodos en el mismo objeto

idea general:

class Foo(){ 
    public boolean method1(); 
    public String method2(); 
    public String method3(); 
    public String shortcut(){ 
    return (method1() == true) ? method2() : method3(); 
    } 
} 

¿Cómo debería probar método de acceso directo?

Sé cómo simular objetos y métodos de prueba que usan otro objeto. Ejemplo:

class Car{ 
    public boolean start(){}; 
    public boolean stop(){}; 
    public boolean drive(int km){}; 
} 
class CarAutoPilot(){ 
    public boolean hasGotExternalDevicesAttached(){ 
    //Hardware specific func and api calls 
    //check if gps is available 
    //check if speaker is on 
    //check if display is on 
    } 
    public boolean drive(Car car, int km){ 
    //drive 
    boolean found = hasGotExternalDevicesAttached(); 
    boolean start = c.start(); 
    boolean drive = c.drive(km); 
    boolean stop = c.stop(); 
    return (found && start && drive && stop) == true; 
    } 
} 

class CarAutoPilotTest(){ 
    @Test 
    public void shouldDriveTenKm(){ 
    Car carMock = EasyMock.Create(Car.class); 
    EasyMock.expect(carMock.start()).andReturns(true); 
    EasyMock.expect(carMock.drive()).andReturns(true); 
    EasyMock.expect(carMock.stop()).andReturns(true); 
    EasyMock.reply(carMock);  

    CarAutoPilot cap = new CarAutoPilot(); 
    boolean result = cap.drive(cap,10); 
    Assert.assertTrue(result); 
    EasyMock.verify(carMock); 
    } 
} 

Pero ¿qué pasa con hasGotExternalDevicesAttached() method? Este es solo un ejemplo de escenario no real. ¿Cómo debo probar el método de manejo? ¿Debería también simular la función hasGotExternalDevicesAttached?

¿Puedo simular la clase que se está probando?

+0

1 para "Cómo debería probar el método duro?" Punny cosas. –

Respuesta

3

Puede crear una subclase de CarAutoPilot en la cual sobrescribe hasGotExternalDevicesAttached(), y ejecutar la prueba con una instancia de esta subclase.

Puede hacerlo en línea:

CarAutoPilot cap = new CarAutoPilot() { 
    public boolean hasGotExternalDevicesAttached(){ 
     // return true or false depending on what you want to test 
    } 
}; 

De esta manera se puede crear una unidad de prueba válida para el resto de la conducta CarAutoPilot 's.

Puede llamar a este simulacro parcial de un hombre pobre si lo desea :-)

+0

Tan simple :) ¡gracias! – kuki1384

3

Crearía una prueba para cada método. Si reduce la complejidad, entonces es mucho más fácil de probar.

éstos deben tener una prueba de cada uno:

public boolean method1(); 
    public String method2(); 
    public String method3(); 

No hay necesidad de probar el último método, ya que llama a sus otros métodos, cómo cada vez, si eso cambia de método (desde im adivinar es sólo un código de ejemplo) y tiene más lógica, entonces también debe tener un método de prueba para eso.

Cuando se trata de hasGotExternalDevicesAttached() debe crear un burlador para todas las llamadas externas que no puede probar.

Si quiere mejorar su habilidad en las pruebas, le recomiendo que lea The Art of Unit Testing. Este es, en mi opinión, el mejor libro para principiantes para aprender y estudiar el arte de las pruebas unitarias.

+0

+1: ¡Estoy muy de acuerdo! – carlspring

+0

Siempre intento simular una llamada externa, pero en este caso tengo un método público simple que verifica varias variables booleanas y devuelve el estado. Este método se usa en otros métodos públicos en el mismo objeto. Anular este método como en la publicación anterior es suficiente para mí. Pero también estoy de acuerdo con tu respuesta. Gracias por la recomendación del libro. Fue útil también – kuki1384

1

Sí, puede, utilizando la biblioteca EasyMock Class Extension. Busque "burla parcial" en el documentation of EasyMock.

La idea es simular solo uno (o algunos) de los métodos de un objeto y probar los métodos que dependen del método simulado.

Cuestiones relacionadas