2012-04-04 13 views
5

Estoy usando EasyMock para crear el simulador que es uno de los parámetros privados (sin setter) en la clase probada. Intenté usar la reflexión, pero no funciona correctamente. informaciónCómo inyectar el simulacro de EasyMock en el campo privado de la clase probada

public class TestedClassTest{ 
    @Test 
    public void test(){ 
     TestedClass instance = new TestedClass(); 
     MockedClass mocked = EasyMock.createMock(MockedClass.class); 
     Data data = new Data(); 

     //Void setter 
     DataType dataType = (myDataType.DataType) EasyMock.anyObject(); 
     mocked.setDataType(dataType); 
     EasyMock.expectLastCall(); 

     //expect 
     EasyMock.expect(mocked.getData()).andReturn(data); 
     EasyMock.replay(mocked); 

     Field field = instance.getClass().getDeclaredField("mockedClass") 
     field.setAccessible(true); 
     field.set(instance, mocked); 

     //run tested method 
     instance.someAction(); 

     EasyMock.verify(mocked); 
    } 
} 

Im consiguiendo FALLO:

Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 

Estoy seguro de que este método se dispara en el objeto "MockedClass" durante la prueba "instance.someAction()"

de cómo resolver este problema?

Editado - Respuesta: después de corregir duplicado replay.mocked() encontré (tan simple!) Que un método más vacío debe ser declarada usando EasyMock.expectLastCall()

Respuesta

3

Su código de reflexión se ve bien.

Ha pasado mucho tiempo desde que utilicé EasyMock, pero ¿no se llama solo replay una vez por prueba en una prueba? Lo estás llamando dos veces. Intente deshacerse de la primera llamada replay.

En este caso, ¿tiene sentido que el campo que contiene el simulacro sea público? En general, los colaboradores deben establecerse mediante el constructor o el instalador, eliminando la necesidad de reflexión.

EDITAR - basado en sus actualizaciones - el error indica que se llamó a setDataType en el simulacro, pero el simulacro no esperaba que se llamara. Tal vez su clase lo está llamando dos veces, quizás se está llamando fuera de servicio, o llamándolo con un argumento que no esperaba (aunque yo esperaría que el error fuera diferente en este caso).

+0

Corregido y teniendo problemas similares – Marcin

+0

¿Está seguro de que el error es el mismo? – hvgotcodes

+0

código editado y error, ¡gracias! – Marcin

Cuestiones relacionadas