Szydełkowanie zazwyczaj działa dobrze, jeśli używasz inwersji wtrysku sterującego i zależności, aby połączyć swoje usługi. Więc człowiek powinien wyglądać
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);
}
}
miejmy nadzieję, że jest oczywiste, że z tej zmiany, można teraz tworzyć makiety i makiety kontrolę WebService i po prostu podłączyć go w teście, ponieważ podczas tworzenia Osoba do testowania , możesz przekazać symulację do konstruktora (lub setera, jeśli pójdziesz tą trasą).
w normalnym środowisku, kontener IoC wstrzyknie prawdziwą usługę internetową w.
Teraz, jeśli nie chcemy mieć do czynienia z tym wszystkim IoC rzeczy, co trzeba zrobić, to oddzielenie od Twojego usługa twoja Osoba (która powinna być nazywana PersonService lub czymś, nie tylko Osobą, która oznacza podmiot). Innymi słowy, sposób w jaki napisany jest kod, można używać tylko jednego typu usługi WebService. Musisz to zrobić, aby osoba potrzebowała tylko pewnego rodzaju usługi WebService, a nie konkretnej, którą masz na stałe.
Wreszcie, w kodzie zapisanym, WebService jest klasą, a nie interfejsem. WebService powinien być interfejsem, a ty powinieneś wdrożyć jakąś implementację. EasyMock działa dobrze z interfejsami; może być w stanie kpić z konkretnych klas (od jakiegoś czasu już go użyłem), ale jako zasada projektowania należy określić wymagany interfejs, a nie konkretną klasę.
Przykro mi to mówić, ale to wstyd. IMHO Jedną z wielkich zalet rozwoju opartego na testach jest to, że jesteś zmuszony do przemyślenia i przemyślenia swojego projektu. Znalezienie czegoś, co nie da się łatwo przetestować pod kątem interfejsów, jest dobrym znakiem zapachu kodu. @hvgotcodes opracował ładną ścieżkę, w jaki sposób można sprawić, by kod był łatwiejszy do utrzymania, elastyczny i testowalny. Nie chciałbym tego wyrzucić za zwykłe obejście. –