2011-10-04 11 views
7

Ho esaminato domande simili su questo forum, ma nessuno di loro ha risposto alla mia domanda. Sembra strano, ma è possibile prendere in giro una chiamata al costruttore sull'oggetto che stai deridendo.EasyMock: simulare una chiamata al costruttore in java

Esempio:

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. 
    } 
} 

Come si può aspettare una chiamata al costruttore? Posso cambiare la chiamata del costruttore del cliente per usare newInstance, ma non sono sicuro che ciò possa essere d'aiuto. Non ho alcun controllo su ciò che fa il corpo del costruttore new Customer(145).

È possibile?

+0

Sarebbe una buona idea non creare connessioni di database in un costruttore. Inietti le connessioni nella classe che le usa. –

+0

concordato. Ma non ho il controllo sulla logica del costruttore del cliente. – Setzer

risposta

11

Non si può fare questo con EasyMock, in quanto non supporta costruttori beffardi. C'è una libreria chiamata powermock che può farlo ed è l'unica libreria di derisione, per quanto ne so, che può stub costruttori e metodi statici in Java.

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

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

è possibile farlo con EasyMock 3.0 e versioni successive.

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