2011-10-04 7 views
7

He consultado preguntas similares en este foro, pero ninguna de ellas responde mi pregunta. Suena extraño, pero ¿es posible burlarse de una llamada de constructor al objeto que te estás burlando?EasyMock: simula una llamada de constructor en java

Ejemplo:

class RealGuy { 

    .... 
    public void someMethod(Customer customer) { 
    Customer customer = new Customer(145); 
    } 
} 
class MyUnitTest() { 
    public Customer customerMock = createMock(Customer.class) 
    public void test1() { 
    //i can inject the mock object, but it's still calling the constuctor 
    realGuyobj.someMethod(customerMock); 
    //the constructor call for constructor makes database connections, and such. 
    } 
} 

¿Cómo puedo esperar una llamada al constructor? Puedo cambiar la llamada del constructor del Cliente para usar newInstance, pero no estoy seguro si eso ayudará. No tengo control sobre lo que hace el cuerpo del constructor new Customer(145).

¿Esto es posible?

+0

Sería una buena idea no hacer conexiones de bases de datos en un constructor. Inyecta las conexiones en la clase usándolas. –

+0

De acuerdo. Pero no tengo control sobre la lógica del constructor del Cliente. – Setzer

Respuesta

11

No se puede hacer esto con easymock, ya que no es compatible con los constructores de imitación. Hay una biblioteca llamada powermock que puede hacer eso y es la única biblioteca burlona, ​​que yo sepa, que puede guardar constructores y métodos estáticos en Java.

1
import static org.powermock.api.easymock.PowerMock.expectNew; 

instance = new UsesNewToInstantiateClass(); 
expectNew(AnyOldClass.class).andReturn(anyClass); 
15

puedes hacerlo con EasyMock 3.0 y superior.

Customer cust = createMockBuilder(Customer.class) 
    .withConstructor(int.class) 
    .withArgs(145) 
    .addMockedMethod("someMethod") 
    .createMock(); 
Cuestiones relacionadas