Pisanie aplikacji, które chociaż w niewielkim stopniu korzystają z usług sieciowych lub zewnętrznych API (facebook, twitter, blip) staje się powoli standardem. Szczególnie teraz, gdy panuje moda na silną integrację tworzonych witryn internetowych z serwisami społecznościowymi i systemami mikroblogowymi. Bywa jednak tak, iż wykorzystująca wymienione wyżej komponenty funkcjonalność, nie może zostać przetestowana z różnych powodów. Wśród najczęstszych można spokojnie wymienić chwilową niedostępność danej usługi. W przypadku przeprowadzania testów jednostkowych, takie uzależnienie ich wyników od dostępności czy też narzutu czasowego związanego z odebraniem i przetworzeniem danych, jest działaniem wysoce niepożądanym. Z pomocą przychodzi nam wzorzec, będący tematem tego wpisu.
service stub
Jest to bardzo prosty design pattern implementujący interfejs konkretnej usługi, mając na celu lokalną imitację jej działania. Daje więc gwarancję pełnej dostępności i szybkości, oferując całkowitą niezależność od zewnętrznych zasobów.

Od teorii przejdźmy do praktycznego przykładu. Na początek interfejs:
interface ServiceInterface {
// zwraca sume dwoch liczb
public function Add($a,$b);
}
Następnie czas na klienta:
// klient korzystajacy z uslugi
class Client {
private $service;
public function __construct (ServiceInterface $obj) {
$this->service = $obj;
}
public function GetService ($a,$b) {
echo $this->service->Add($a,$b);
}
}
Oraz usługę rzeczywistą – RealService oraz ServiceStub:
// lokalna implementacja "uslugi zastepczej"
class ServiceStub implements ServiceInterface {
// lokalnie, szybko, bez czynnikow ktore
// nalezy uwzglednic w przypadku klasy
// RealService
public function Add ($a,$b) {
return $a+$b;
}
}
class RealService implements ServiceInterface {
public function Add ($a,$b) {
// w przykladzie pominieto implementacje tej
// metody, ale zakladamy ze:
// wymaga polaczenia z zewnetrznymi zasobami
// a jej wywolanie jest kosztowne
}
}
Na końcu użycie:
// ServiceStub zamiast RealService na // potrzeby srodowiska testowego $client = new Client(new ServiceStub()); $client->GetService(12,22);
Mam nadzieję, że powyższy przykład jest na tyle prosty, by nie sprawić nikomu większych trudności w jego zrozumieniu. Zachęcam do własnych eksperymentów.
3 Odpowiedzi : “service stub”


sprytne i czuje ze przyda mi sie przy jednym z projektów. mam jednak pytanie.
z projekcie takich serwisow bede mial o wiele wiecej i chcialbym aby gdzies w panelu administracyjnym dało się konfigurować który serwis ma być akurat wykorzystywany. cos w rodzaju:
$service = ServiceStub; // to uzytkownik moze sobie konfigurowac
$client = new Client(new $service());
gdzie $service to metoda wywolujaca konkretny serwis. da sie sie cos takiego zrobic? te powyzej jest na pewno zle zapisane, wlasnnie dlatego pytam jak powinno byc to zrobione prawidlowo
Zgodnie z przykładem z wpisu można zrobić tak:
$service = ‘ServiceStub’;
$client = new Client(new $service());
$client->GetService(12,22);
Podobnie jest z wywoływaniem funkcji, o czym pisałem tutaj: http://blogophp.com/2008/10/31/zmienne-i-funkcje-dynamiczne/
dzieki za odpowiedz
btw, doinstaluj sledzenie komentarzy
http://muzungu.pl/2010/09/07/grzech-smiertelny-kazdego-blogera/muzungu-skomputeryzowany/wordpress-muzungu-skomputeryzowany/
o tym, ze czeka tu na mnie jakas odpowiedz przypomnial mi dopiero Twoj nowy wpis
nie dziw sie zatem ze pod wpisami – mimo wielu zapewne czytelnikow – nie masz dyskusji