derisione in genere funziona bene se si utilizza l'inversione di controllo e di iniezione di dipendenza per cablare i propri servizi. Così la vostra persona dovrebbe assomigliare
public class Person() {
WebService ws = null;
// or use setters instead of constructor injection
Persion(WebService ws) {
this.ws = ws;
}
public Person find(int id) {
return ws.getPersonById(id);
}
}
si spera, è chiaro che con questo cambiamento, è ora possibile creare un controllo finto e finta per WebService e basta collegarlo nel test, perché quando si crea la persona alla prova , puoi passare la simulazione al costruttore (o setter se segui quella strada).
Nel vostro ambiente reale, il contenitore IoC inietterà il servizio web reale.
Ora, se non si vuole affrontare con tutta questa roba CIO, che cosa dovete fare è di disaccoppiare il tuo webservice da la tua Persona (che dovrebbe essere chiamata PersonService o qualcosa, non solo Persona, che denota entità). In altre parole, il modo in cui il codice viene scritto è possibile utilizzare solo un tipo di WebService. Hai bisogno di fare in modo che il persona ha solo bisogno di un po 'di tipo di WebService, non quella specifica avete hard-coded in.
Infine, nel codice come scritto, WebService è una classe, non un'interfaccia. Il WebService dovrebbe essere un'interfaccia e dovresti implementare una sorta di implementazione. EasyMock funziona bene con le interfacce; potrebbe essere in grado di prendere in giro classi concrete (è stato un po 'che non l'ho usato), ma come principio di progettazione è necessario specificare l'interfaccia richiesta, non la classe concreta.
Mi spiace dirlo, ma è un peccato. IMHO una delle grandi cose sullo sviluppo guidato dai test è che sei costretto a pensare e ripensare al tuo design. Trovare qualcosa che non è facilmente testabile contro le interfacce è un buon segno di odore di codice. @hvgotcodes ha tracciato un buon percorso, in che modo è possibile rendere il codice più gestibile, flessibile e verificabile. Non vorrei buttarlo via per una semplice soluzione. –