2011-08-17 20 views
6

Obtuve una clase usando una fábrica para crear algún objeto. En mi prueba de unidad me gustaría acceder al valor de retorno de la fábrica. Como la fábrica se pasa directamente a la clase y no se proporciona ningún getter para el objeto creado, tengo que interceptar el regreso del objeto de la fábrica.Mockito + Spy: Cómo recopilar los valores devueltos

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(factory); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 

¿Existe la posibilidad de acceder al valor de retorno de la fábrica? ¿Probablemente usando el espía?
La única manera que puedo ver es burlarse de la fábrica de crear ... método

Saludos

+0

'¿Por qué debe tener TestedClass' en la fábrica como la dependencia. ¿No debería simplemente pedir la clase real creada por la fábrica? ? (Ley de Demeter) –

+0

El 'TestedClass' es un OSGi-Component. Un método del componente requiere que cada invocación sea un nuevo objeto creado por la fábrica. Refactoré la creación de objetos en una clase de fábrica para proporcionar una mejor capacidad de prueba. Dado que el objeto creado se inicializa según los parámetros del método, no hay forma de pasar simplemente los objetos creados en lugar de la fábrica. –

Respuesta

1

El enfoque estándar de burla sería:

  1. Pre-crear el objeto que desea la fábrica para volver en el caso de prueba
  2. Crear un simulacro (o espía) de fábrica
  3. Prescribir el simulacro de fábrica para devolver el objeto creado previamente.

Si realmente quiere tener la RealFactory crear el objeto sobre la marcha, puede subclase y anular el método de fábrica para llamar super.create(...), a continuación, guardar la referencia a un campo accesible por la clase de prueba, y luego regreso el objeto creado

24

En primer lugar, debe pasar spy en como el argumento del constructor.

Dejando esto a un lado, así es cómo podría hacerlo.

public class ResultCaptor<T> implements Answer { 
    private T result = null; 
    public T getResult() { 
     return result; 
    } 

    @Override 
    public T answer(InvocationOnMock invocationOnMock) throws Throwable { 
     result = (T) invocationOnMock.callRealMethod(); 
     return result; 
    } 
} 

intención de uso:

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(spy); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 


// let's capture the return values from spy.create() 
ResultCaptor<RealThing> resultCaptor = new ResultCaptor<>(); 
doAnswer(resultCaptor).when(spy).create(); 

// do something that will trigger a call to the factory 
testedClass.doSomething(); 

// validate the return object 
assertThat(resultCaptor.getResult()) 
     .isNotNull() 
     .isInstanceOf(RealThing.class); 
+0

Gracias por compartir. En mi humilde opinión: Esta debería ser la respuesta aceptada. – BetaRide

Cuestiones relacionadas