Wiremock + spring boot

0

Mam do wykonania "proxy" z użyciem spring boota + web oraz wiremocka.
Działać ma to tak, że pobierany jest request od nadawcy i w zależności od tego, jakiego typu http jest żądanie, ma wysłać do odpowiedniego systemu - wiremock (np. GET - system1), który zwróci mu jakąś odpowiedź.
Wykorzystać należy RestController i RestTemplate.

Nigdy nie miałem do czynienia z WireMockiem, ale rozumiem to tak, że stawiam sobie standardowy kontroler w springu, mapuje żądania przy użyciu @RequestMapping (wcześniej @RestController), następnie w ciele tego kontrolera rozpoznaję metodę i wysyłam jakieś żądanie do np. System 1(symulowanego za pomocą WireMock), który następnie coś mi tam zwraca i to np. zwracam klientowi do przeglądarki. Czy dobrze to rozumiem? Wczytuję się już którąś godzinę, w jaki sposób przy użyciu tego WireMocka to zrobić. Wszędzie poruszane są kwestie testów, ale to chyba nie o to chodzi, skoro ja chcę tylko pobrać żądanie i coś zwrócić?

public class WireMockEx {
    RestTemplate restTemplate;
    ResponseEntity response;

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8080).httpsPort(8443));

    @Before
    public void setup() throws Exception {
        restTemplate = new RestTemplate();
        response = null;
    }
    
    public void exactUrlOnly() {
        stubFor(get(urlEqualTo("/")).willReturn(
                aResponse()
                        .withStatus(200)
                        .withHeader("Content-Type", "text/plain")
                        .withBody("response!")));
    }
}

Ale w takim razie, jak z samego kontrolera wysłać żądanie do tego WireMocka, w jaki sposób przetworzyć je i zwrócić coś do klienta (czyli zwrócić do kontrolera javy i wyświetlić użytkownikowi)?
Bardzo proszę o jakieś wskazówki, może przykład na Githubie, bo przeglądam całego guida Wiremocka i nie mogę tam znaleźć rzeczy, która mi takie coś umożliwi.

1

Średnio cię rozumiem.
Chodzi o to, żeby użyć RestTemplate i wysłać żądanie na serwer, który zamockowałeś wiremockiem?

EDIT:
Rozumiem, że masz aplikacje SpringBootową. Ktoś używający tej aplikacji wysyła do ciebie RESTA GET /magic-stuff i chce dostać magiczny proszek.
Niestety twoja aplikacja, nie ma magicznego proszku, więc musisz uderzyć do innej aplikacji która go ma też po REŚCIE GET /magic-powder.
Więc masz dwie aplikacje: jedna Spring-Boota działająca na przykład pod 127.0.0.1:8080, a druga działająca pod 127.0.0.1:8081. Druga nie może działać pod 8080, bo ten socket jest już zajęty.
Czyli użytkownik do ciebie uderza pod GET 127.0.0.1:8080/magic-stuff, więc ty uderzasz pod GET 127.0.0.1:8081/magic-powder, dostajesz magiczny proszek i zwracasz go użytkownikowi?

Pewnie ta druga aplikacja jeszcze nie istnieje, ale serwis chcesz napisać już teraz. Więc chcesz sobie zamockować WireMockiem tą drugą aplikację i do niej bić po RESCIE? A potem jak druga już będzie istniała, to tylko zmienisz adres ip i port i wszystko będzie działać?

0
Tyvrel napisał(a):

Pewnie ta druga aplikacja jeszcze nie istnieje, ale serwis chcesz napisać już teraz. Więc chcesz sobie zamockować WireMockiem tą drugą aplikację i do niej bić po RESCIE? A potem jak druga już będzie istniała, to tylko zmienisz adres ip i port i wszystko będzie działać?

Tak, dokładnie takie coś chciałbym uzyskać. Nakierujesz na jakiś przykład wykonania czegoś takiego?

2

Oczywiście, że mogę cię nakierować jak to zrobić: nie rób tego.
Załóżmy, że twój MagicStuffService korzysta z RestTemplate, żeby dobierać się do Tej-Drugiej-Aplikacji.

class MagicStuffService {
	MagicStuff getMagicStuff() {
		return restTemplate.get(restTemplate.getForEntity("http://localhost:8081/magic-powder", MagicStuff.class));
	}
}

Zamiast tego zrób warstwę pośrednią i zamiast RestTemplate używaj TheOtherApplicationClient:

class MagicStuffService {
	MagicStuff getMagicStuff() {
		return theOtherApplicationClient.getMagicStuff();
	}
}

Oraz zrób dwie implementacje, jednego stuba, który nic nie robi:

class TheOtherApplicationMockedClient {
	MagicStuff getMagicStuff() {
		return mockedMagicStuff;
	}
}

A jak już aplikacja będzie, to możesz zaimplementować clienta na podstawie istniejącego api:

class TheOtherApplicationClient {
	MagicStuff getMagicStuff() {
		return restTemplate.get(restTemplate.getForEntity("http://localhost:8081/magic-powder", MagicStuff.class));
	}
}

I użyj springowych czarów (np. profili), żeby sobie podmieniać implementacje.
Tak w sumie, to prawdziwego TheOtherApplicationClient możesz już napisać. Tylko go nie podpinaj pod aplikację, niech póki co będzie nieużywany.
Możesz też napisać do niego testy (testy testujące tylko TheOtherApplicationClient) używając WireMocka. Do tego służy WireMock - testowania. Używanie go do mockowania zewnętrznego serwisu odpalanego z działającej aplikacji to zbrodnia!

1 użytkowników online, w tym zalogowanych: 0, gości: 1