Mam takie zależności w projekcie (mini PaaS)
AppController 🡒 AppFacade 🡒 AppManager
AppManager 🡒 {GitCloner, DockerImageManager, DockerContainerManager}
AppFacade 🡒 AppRepository 🡒 Baza
Scenariusz (w uproszczeniu): użytkownik wysyła POST zawierający link do repozytorium z kodem aplikacji, a mój system ją testuje i wdraża (Docker).
- POST
- AppController: sprawdzenie poprawności DTO i przekazanie go do fasady
- AppFacade tworzy instancję AppManager i wywołuje odpowiednie metody (AppManager - wysokopoziomowa klasa do wdrażania aplikacji i zarządzania nimi)
- AppManager używa GitClonera do sklonowania repo. GitCloner zwraca ścieżkę do sklonowanego na dysk kodu
- AppManager używa DockerImageManagera oraz DockerContainerManagera do zbudowania obrazu ze sklonowanego kodu i uruchomienia kontenera
- Wracamy do AppFacade. AppFacade wyciąga sobie potrzebne informacje z instancji AppManager.
Uwaga: wyciągane informacje pochodzą też z "żywego" systemu, gdzie konieczne jest zapytanie Dockera (za pośrednictwem DockerContainerManagera) o informacje na temat działającego kontenera. - AppFacade zapisuje dane do bazy, korzystając z AppRepository
- AppFacade tworzy DTO, które następnie zwraca do kontrolera
- Użytkownik otrzymuje odpowiedź
Jak to testować? Chodzi o to, żeby podczas testów fasady/kontrolera zamockować punkty 4 i 5 (częściowo też pkt 6 - wyciąganie informacji o kontenerze), które zabierają bardzo dużo czasu.
Innymi słowy: GitCloner, DockerImageManager i DockerContainerManager w testach fasady/kontrolera muszą odejść. Są już przetestowane jednostkowo.
Problem: nie mam bezpośredniego dostępu do tych klas. Ich obiekty są tworzone i używane wewnątrz AppManagera i na zewnątrz nikt o nich nie wie.
Mój plan: zrobić mocki GitClonera, DockerImageManagera i DockerContainerManagera (PowerMock da radę?).
Ale...
..słyszałem dużo złego o używaniu PowerMock (typu: jeżeli potrzebny jest PowerMock to znaczy, że z kodem jest coś nie tak). Więc może rzeczywiście mam kupę w kodzie? :/
Od razu mówię, że nie robiłem jeszcze mocków i testów dla "rozbudowanego" systemu.
Jeżeli potrzebne jest spojrzenie na kod: https://github.com/Potat0x/PotaPaaS-Service/tree/master/src/main/java/pl/potat0x/potapaas/potapaasservice
Klasy, które chcę zamockować siedzą w pakiecie core
.
Będę wdzięczny za wskazówki :)