{"id":14140,"date":"2022-07-08T07:00:42","date_gmt":"2022-07-08T05:00:42","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=14140"},"modified":"2023-02-16T14:48:12","modified_gmt":"2023-02-16T13:48:12","slug":"mock-server-co-to-jest-i-dlaczego-warto-poznac-go-lepiej","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/mock-server-co-to-jest-i-dlaczego-warto-poznac-go-lepiej\/","title":{"rendered":"Mock-server \u2013 co to jest i dlaczego warto pozna\u0107 go lepiej?"},"content":{"rendered":"\n<p>Standardem w tworzeniu system\u00f3w staj\u0105 si\u0119 mikroserwisy, w kt\u00f3rych dzia\u0142anie aplikacji jest cz\u0119sto zale\u017cne od dost\u0119pno\u015bci innych aplikacji. Nastr\u0119cza to problem\u00f3w cho\u0107by z odtworzeniem do\u015b\u0107 specyficznych b\u0142\u0119d\u00f3w w procesach, w kt\u00f3rych uczestnicz\u0105 inne serwisy.&nbsp;Trudno\u015bci\u0105 jest zasymulowanie zachowania systemu, gdy serwis za d\u0142ugo nie odpowiada lub po\u0142\u0105czenie zosta\u0142o przerwane w trakcie. Podobnie jest z potrzeb\u0105 sprawdzenia lokalnie dzia\u0142ania ca\u0142ego procesu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mock-server \u2013 do czego s\u0142u\u017cy<\/h2>\n\n\n\n<p>Tutaj z pomoc\u0105 mo\u017ce nam przyj\u015b\u0107 mock-server. Jest to&nbsp;<strong>projekt, kt\u00f3ry umo\u017cliwia zasymulowanie dzia\u0142anie innego serwisu oraz \u0142atwe konfigurowanie oczekiwanych odpowiedzi statycznych i dynamicznych<\/strong>, zale\u017cnych od danych, jakie przyjd\u0105 w \u017c\u0105daniu.<\/p>\n\n\n\n<p>Mock-server wspiera:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>protoko\u0142y http,<\/li><li>https,<\/li><li>po\u0142\u0105czenie websocket.<\/li><\/ul>\n\n\n\n<p>Przy po\u0142\u0105czeniu SSL&nbsp;<a href=\"https:\/\/github.com\/mock-server\/mockserver\/blob\/master\/mockserver-core\/src\/main\/resources\/org\/mockserver\/socket\/CertificateAuthorityCertificate.pem\" rel=\"nofollow\" >domy\u015blnie jest u\u017cywany ich certyfikat<\/a>. Oczywi\u015bcie, mo\u017cna wgra\u0107 te\u017c w\u0142asny, co zostanie wyja\u015bnione w dalszej cz\u0119\u015bci artyku\u0142u.&nbsp;<a href=\"http:\/\/loclahost:%3cport%3e\/mockserver\/dashboard\">Aplikacja udost\u0119pnia tak\u017ce skromny interfejs u\u017cytkownika<\/a>, pod kt\u00f3rym da si\u0119 podejrze\u0107 aktualn\u0105 konfiguracj\u0119 i logi, a tak\u017ce po nich filtrowa\u0107.<\/p>\n\n\n\n<p>Ponadto, mock-server udost\u0119pnia API umo\u017clwiaj\u0105ce zarz\u0105dzanie i konfiguracj\u0119. Opisa\u0142em tu tylko cz\u0119\u015b\u0107 funkcjonalno\u015bci \u2013&nbsp;<a href=\"https:\/\/www.mock-server.com\/\" rel=\"nofollow\" >wi\u0119cej znajdziecie w oficjalnej dokumentacji<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podstawowe informacje dot. uruchomienia i integracji<\/h2>\n\n\n\n<p>Mock-server mo\u017cna uruchomi\u0107 lub zintegrowa\u0107 na wiele sposob\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Przy u\u017cyciu obrazu Dockera.<\/li><li>Z u\u017cyciem menad\u017cera paczek helm w \u015brodowisku Kubernetesa.<\/li><li>Jako cz\u0119\u015b\u0107 procesu budowania w Maven i Grunt.<\/li><li>Bezpo\u015brednio w aplikacji Java<ul><li>w testach Junit4 wykorzystuj\u0105c adnotacj\u0119 @Rule,<\/li><li>w Junit5 z wykorzystaniem adnotacji @ExtendWith,<\/li><li>w Spring Test Execution Listener z adnotacj\u0105 @MockServerTest.<\/li><\/ul><\/li><li>Uruchomienie przez Node.js (npm).<\/li><li>Bezpo\u015brednio z linii komend za pomoc\u0105<ul><li>Homebrew,<\/li><li>uruchomienie pliku jar,<\/li><li>Mavena,<\/li><li>Dockera.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>W artykule przedstawi\u0119 jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>uruchomi\u0107 mock-server,<\/li><li>skonfigurowa\u0107 oczekiwane odpowiedzi,<\/li><li>u\u017cy\u0107 w\u0142asnego certyfikatu,<\/li><li>wymusi\u0107 mTls.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Uruchamiamy mock-server<\/h2>\n\n\n\n<p>Uruchomienie z linii komend z u\u017cyciem java jest moim zdaniem najszybszym i najprostszym sposobem. Wymagane jest tylko posiadanie zainstalowanej javy w wersji 8+ i pobranie wersji mock-servera z wbudowanym serwerem.<\/p>\n\n\n\n<p>Dost\u0119pne wersje mock-servera z wbudowanym serwerem netty mo\u017cna znale\u017a\u0107&nbsp;<a href=\"https:\/\/repo1.maven.org\/maven2\/org\/mock-server\/mockserver-netty\" rel=\"nofollow\" >tutaj<\/a>. Tylko wersje z suffixem&nbsp;<em>shaded<\/em>&nbsp;(starsze wersje maj\u0105 suffix&nbsp;<em>jar-with-dependecies<\/em>) zawieraj\u0105 wszystkie niezb\u0119dne zale\u017cno\u015bci potrzebne do uruchomienia.<\/p>\n\n\n\n<p>Na potrzeby artyku\u0142u pobra\u0142em plik&nbsp;<strong>mockserver-netty-5.12.0-shaded.jar<\/strong>. Po pobraniu pliku jar, w zale\u017cno\u015bci od zainstalowanej wersji javy, nale\u017cy wywo\u0142a\u0107 jedn\u0105 z poni\u017cszych komend w folderze w kt\u00f3rym znajduje si\u0119 nasza aplikacji.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Komenda dla javy 8<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\njava -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080,1081 -logLevel INFO\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Komenda dla javy 9+<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava --add-exports=java.base\/sun.security.x509=ALL-UNNAMED --add-exports=java.base\/sun.security.util=ALL-UNNAMED -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080,1081 -logLevel INFO\n<\/pre><\/div>\n\n\n<p>Kod mock-servera w wersji 5.12.0 nie jest w pe\u0142ni dostosowany do nowej javy 9+, dlatego uruchomienie go wymaga\u0142o podania dw\u00f3ch dodatkowych argument\u00f3w:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n--add-exports=java.base\/sun.security.x509=ALL-UNNAMED\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n--add-exports=java.base\/sun.security.util=ALL-UNNAMED\n<\/pre><\/div>\n\n\n<p>Ponadto, zosta\u0142y podane parametry stricte zwi\u0105zane z samym mock-serverem<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">pARAMETR<\/th><th class=\"has-text-align-center\" data-align=\"center\">OPIS<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">-serverPort &lt;lista port\u00f3w po przecinki&gt;<\/td><td class=\"has-text-align-center\" data-align=\"center\">Mo\u017cna poda\u0107 jeden lub wi\u0119cej port\u00f3w na jakich ma nas\u0142uchiwa\u0107 mock-server<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">-logLevel &lt;poziom&gt;<\/td><td class=\"has-text-align-center\" data-align=\"center\">Poziom log\u00f3w, jakie b\u0119d\u0105 pisane do konsoli. Mo\u017cna ustawi\u0107: INFO, WARN, DEBUG, TRACE<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">-Dmockserver.logLevel=OFF<\/td><td class=\"has-text-align-center\" data-align=\"center\">Wy\u0142\u0105czenie pisania log\u00f3w z klas mock-servera<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">-Droot.logLevel=OFF<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ca\u0142kowite wy\u0142\u0105czenie logowania<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Weryfikacja dzia\u0142ania aplikacji<\/h3>\n\n\n\n<p>Najprostszym sposobem&nbsp;<a href=\"http:\/\/localhost:1080\/mockserver\/dashboard\" rel=\"nofollow\" >sprawdzenia czy nasza aplikacja dzia\u0142a, jest wej\u015bcie na stron\u0119<\/a>, gdzie udost\u0119pniono dashboard mock-servera, w kt\u00f3rym mo\u017cemy podejrze\u0107 logi, filtrowa\u0107 po nich, a tak\u017ce zobaczy\u0107 aktualn\u0105 konfiguracj\u0119 odpowiedzi mock-servera.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tworzenie statycznej oczekiwanej odpowiedzi<\/h2>\n\n\n\n<p>Domy\u015blnie aplikacja zwraca 404 na ka\u017cdy request. Odpowiedzi mo\u017cna skonfigurowa\u0107 przez api mock-servera.&nbsp;<a href=\"https:\/\/app.swaggerhub.com\/apis\/jamesdbloom\/mock-server-openapi\/5.12.x\" rel=\"nofollow\" >Opisy punkt\u00f3w kra\u0144cowych (endpoint\u00f3w)<\/a>&nbsp;s\u0105 dost\u0119pne do sprawdzenia. Mo\u017cna tak\u017ce wczyta\u0107 odpowiedzi z pliku z u\u017cyciem statycznych odpowiedzi, wykorzystuj\u0105c OpenApi w wersji trzeciej lub Apache Velocity.<\/p>\n\n\n\n<p>W artykule zaproponowa\u0142em inicjalizacj\u0119 odpowiedzi z pliku, wykorzystuj\u0105c sk\u0142adnie mock-servera do statycznych odpowiedzi. Nale\u017cy stworzy\u0107 plik z rozszerzeniem json, w kt\u00f3rym znajduje si\u0119 lista ze statycznymi odpowiedziami. W moim przypadku jest to plik init.json.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n&#x5B;{\n\"httpRequest\": {\n\"method\":\"GET\",\n\"path\": \"\/some\/path\"\n},\n\"httpResponse\": {\n\"headers\": {\n\"content-type\": &#x5B;\"applications\/json\"]\n},\n\"body\": {\n\"field\":\"value\",\n\"field\":\"value2\"\n}\n}]\n}}]\n<\/pre><\/div>\n\n\n<p>Nast\u0119pnie, musimy uruchomi\u0107 mock-server, dodaj\u0105c dodatkowe parametry:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n-Dmockserver.initializationJsonPath=&amp;lt;\u015bcie\u017cka do pliku&gt;\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n-Dmockserver.watchInitializationJson=true\n<\/pre><\/div>\n\n\n<p>Dmockserver.initializationJsonPath wskazuje na \u015bcie\u017ck\u0119 z plikiem konfiguracyjnym. Natomiast Dmockserver.watchInitializationJson=true co 5 sekund sprawdza, czy w pliku nie nast\u0105pi\u0142y zmiany, dzi\u0119ki czemu nie ma potrzeby restartowania aplikacji, gdy modyfikujemy oczekiwane odpowiedzi.<\/p>\n\n\n\n<p>Poni\u017cej znajdziecie pe\u0142ne komendy. Nale\u017cy podmieni\u0107&nbsp;<em>&lt;\u015bcie\u017cka do pliku konfiguracyjnego<\/em>&gt; na pe\u0142n\u0105 lub relatywn\u0105 \u015bcie\u017ck\u0119 do wcze\u015bniej utworzonego pliku.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Komenda dla javy 8<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava -Dmockserver.initializationJsonPath=init.json -Dmockserver.watchInitializationJson=true -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080,1081 -logLevel INFO\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Komenda dla javy 9+<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava --add-exports=java.base\/sun.security.x509=ALL-UNNAMED --add-exports=java.base\/sun.security.util=ALL-UNNAMED -Dmockserver.initializationJsonPath=init.json -Dmockserver.watchInitializationJson=true -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080,1081 -logLevel INFO\n<\/pre><\/div>\n\n\n<p>Nast\u0119pnie wystarczy wykona\u0107 \u017c\u0105danie GET pod adres&nbsp;<a href=\"http:\/\/localhost:1080\/some\/path\" rel=\"nofollow\" >http:\/\/localhost:1080\/some\/path<\/a>, a w odpowiedzi otrzymamy jsona :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n{\n\u201efield\u201d:\u201dvalue\u201d,\n\u201efield\u201d:\u201dvalue2\u201d\n}\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Sekcje httpRequest i httpResponse<\/h3>\n\n\n\n<p>W przyk\u0142adzie konfiguracji odpowiedzi wida\u0107 dwie sekcje:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>httpRequest,<\/li><li>httpResponse.<\/li><\/ul>\n\n\n\n<p>Sekcja httpRequest zawiera konfiguracj\u0119, dla jakiego \u017c\u0105dania ma by\u0107 zwr\u00f3cona odpowied\u017a z sekcji httpResponse. Mo\u017cna filtrowa\u0107 po \u015bcie\u017cce, metodzie, parametrach i wielu innych.<\/p>\n\n\n\n<p>Aby dowiedzie\u0107 si\u0119 wi\u0119cej, polecam&nbsp;<a href=\"https:\/\/www.mock-server.com\/mock_server\/creating_expectations.html#request_properties_matchers\" rel=\"nofollow\" >zajrze\u0107 do dokumentacji w sekcji \u201eCreating Expectations\u201d.<\/a><\/p>\n\n\n\n<p>W sekcji httpResponse jest definicja dok\u0142adnej odpowiedzi. Opr\u00f3cz jej cia\u0142a mo\u017cna zdefiniowa\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>status odpowiedzi,<\/li><li>nag\u0142\u00f3wki,<\/li><li>ciasteczka,<\/li><li>a tak\u017ce symulowa\u0107 op\u00f3\u017anienia wyst\u0119puj\u0105ce w sieci.<\/li><\/ul>\n\n\n\n<p><a href=\"https:\/\/www.mock-server.com\/mock_server\/creating_expectations.html#response_action\" rel=\"nofollow\" >Opis wszystkich mo\u017cliwo\u015bci<\/a>&nbsp;znajdziecie na stronie mock-server.<\/p>\n\n\n\n<p><strong>Wa\u017cne!<\/strong>&nbsp;Nale\u017cy pami\u0119ta\u0107, \u017ce lista odpowiedzi jest analizowana od g\u00f3ry do do\u0142u i brana jest pierwsza pasuj\u0105ca odpowied\u017a wed\u0142ug kryteri\u00f3w zdefiniowanych w sekcji httpRequest.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konfiguracja w osobnym pliku<\/h2>\n\n\n\n<p>Przy wi\u0119kszej ilo\u015bci parametr\u00f3w wygodniejsze b\u0119dzie przeniesienie konfiguracji do osobnego pliku properties. W moim przypadku b\u0119dzie to plik mock-server.properties. Poni\u017cej znajdziecie jego tre\u015b\u0107.<br>Nie ma tam jedynie parametru -serverPort 1080,1081, kt\u00f3ry w dalszym ci\u0105gu musi by\u0107 podany jako parametr uruchomieniowy.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nmockserver.logLevel=INFO\nmockserver.disableLogging=false\nmockserver.disableSystemOut=false\nmockserver.initializationJsonPath=init.json\nmockserver.watchInitializationJson=true\n<\/pre><\/div>\n\n\n<p>Doszed\u0142 nam jeden nowy parametr:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>-Dmockserver.propertyFile=&lt;\u015bcie\u017cka do pliku konfiguracyjnego&gt;<\/li><\/ul>\n\n\n\n<p>W folderze, z kt\u00f3rego uruchamiamy aplikacj\u0119, powinny znajdowa\u0107 si\u0119 3 pliki:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>mockserver-netty-5.12.0-shaded.jar<\/li><li>properties<\/li><li>json<\/li><\/ol>\n\n\n\n<p>Komenda do uruchomienia aplikacji wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Komenda dla javy 8<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava -Dmockserver.propertyFile=mockserver.properties -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080,1081\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Komenda dla javy 9+<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava --add-exports=java.base\/sun.security.x509=ALL-UNNAMED --add-exports=java.base\/sun.security.util=ALL-UNNAMED -Dmockserver.propertyFile=mockserver.properties -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080,1081\n<\/pre><\/div>\n\n\n<p>Je\u015bli nie zmodyfikowali\u015bmy init.json, to po uruchmonieniu aplikacji mock-server i wykonaniu \u017c\u0105dania&nbsp;<a href=\"http:\/\/localhost:1080\/some\/path\" rel=\"nofollow\" >http:\/\/localhost:1080\/some\/path<\/a>&nbsp;o typie GET, w odpowiedzi otrzymamy jsona o tre\u015bci:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n{\n\u201efield\u201d:\u201dvalue\u201d,\n\u201eField\u201d:\u201dvalue2\u201d\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Tworzenie dynamicznej odpowiedzi<\/h2>\n\n\n\n<p>Odpowiedzi dynamiczne mo\u017cna stworzy\u0107 na dwa sposoby. Jednym z nich jest wykorzystanie javascriptTemaplate, a drugim dodanie do \u015bcie\u017cki klasy pliku jar zawieraj\u0105cego klas\u0119 implementuj\u0105c\u0105 interfejs org.mockserver.mock.action.ExpectationResponseCallback.<\/p>\n\n\n\n<p>W artykule przedstawi\u0119 tylko drug\u0105 metod\u0119. Zwi\u0105zane jest to z usuni\u0119ciem z javy 15+ silnika nashrom, w zwi\u0105zku z czym pierwszy spos\u00f3b nie zadzia\u0142a ju\u017c na javie wy\u017cszej ni\u017c 15.<\/p>\n\n\n\n<p>Do stworzenia klasy wystarczy nam zwyk\u0142y edytor tekstowy. Mo\u017cna te\u017c u\u017cy\u0107 IDE \u2013 w tym wypadku polecam doda\u0107 wcze\u015bniej u\u017cyt\u0105 wersj\u0119 aplikacji mock-server jako bibliotek\u0119, aby w IDE dzia\u0142a\u0142o automatyczne podpowiadanie sk\u0142adni. Aplikacja zostanie skompilowana i zbudowana przy u\u017cyciu javac, kt\u00f3re jest dost\u0119pne wraz zainstalowan\u0105 jav\u0105.<\/p>\n\n\n\n<p>W moim przypadku wykorzystem Inteljii Idea Community Edition. Tworz\u0119 przy jego u\u017cyciu pusty projekt, w nim folder libs i kolejno umieszczam w nim plik jar z mock-servera. U mnie jest to mockserver-netty-5.12.0-shaded.jar. Dodaj\u0119 ten plik jako zewn\u0119trzn\u0105 bibliotek\u0119 projektu. Dost\u0119pny jest tak\u017ce&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/idea\/library.html#define-library\" rel=\"nofollow\" >poradnik jak to zrobi\u0107 w Idea Community Edition<\/a>.<\/p>\n\n\n\n<p>W projekcie tworzymy klas\u0119 mockserver.response.SampleResponse implementuj\u0105c\u0105 interfejs org.mockserver.mock.action.ExpectationResponseCallback i metod\u0119&nbsp;<em>public HttpResponse handle(HttpRequest httpRequest)<\/em>. Klasa HttpResponse implementuje wzorzec budowniczy, dzi\u0119ki czemu mo\u017cemy szybko stworzy\u0107 oczekiwan\u0105 odpowied\u017a.<\/p>\n\n\n\n<p>W przyk\u0142adzie w odpowiedzi zwr\u00f3cimy to samo, co zosta\u0142o nam przekazane w \u017c\u0105daniu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npackage mockserver.response;\n \nimport org.mockserver.mock.action.ExpectationResponseCallback;\nimport org.mockserver.model.HttpRequest;\nimport org.mockserver.model.HttpResponse;\n \npublic class SampleResponse implements ExpectationResponseCallback {\n \n@Override\npublic HttpResponse handle(HttpRequest httpRequest) throws Exception {\nreturn&amp;amp;nbsp; HttpResponse.&amp;lt;em&gt;response&amp;lt;\/em&gt;()\n.withBody(httpRequest.getBodyAsString())\n.withStatusCode(200);\n}\n \n}\n<\/pre><\/div>\n\n\n<p>Stworzy\u0142em tak\u017ce drug\u0105 klas\u0119, kt\u00f3ra w odpowiedzi zwraca to samo tylko ze statusem 500.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npackage mockserver.response;\n \nimport org.mockserver.mock.action.ExpectationResponseCallback;\nimport org.mockserver.model.HttpRequest;\nimport org.mockserver.model.HttpResponse;\n \npublic class SampleResponse2 implements ExpectationResponseCallback {\n \n@Override\npublic HttpResponse handle(HttpRequest httpRequest) throws Exception {\nreturn&amp;amp;nbsp; HttpResponse.&amp;lt;em&gt;response&amp;lt;\/em&gt;()\n.withBody(httpRequest.getBodyAsString())\n.withStatusCode(500);\n}\n \n}\n<\/pre><\/div>\n\n\n<p>Sama struktura projektu powinna wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-1-3.png\"><img decoding=\"async\" width=\"599\" height=\"305\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-1-3.png\" alt=\"\" class=\"wp-image-18447\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-1-3.png 599w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-1-3-300x153.png 300w\" sizes=\"(max-width: 599px) 100vw, 599px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Nast\u0119pnym krokiem jest skompilowanie naszych dw\u00f3ch klas i wygenerowanie paczki jar. Kod mo\u017cna skompilowa\u0107 wywo\u0142uj\u0105c komend\u0119:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njavac -cp .\\lib\\mockserver-netty-5.12.0-shaded.jar .\\mockserver\\response\\*.java -d out\n<\/pre><\/div>\n\n\n<p>W rezultacie zostan\u0105 skompilowane wszystkie klasy w pakiecie&nbsp;<em>mockserver.response,<\/em>&nbsp;a wynik kompilacji znajdzie si\u0119 w folderze out. Powinno wygl\u0105da\u0107 to nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1.png\"><img decoding=\"async\" width=\"513\" height=\"227\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1.png\" alt=\"\" class=\"wp-image-18463\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1.png 513w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/01\/Ryc.-2-1-300x133.png 300w\" sizes=\"(max-width: 513px) 100vw, 513px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Nast\u0119pnie wywo\u0142ujemy polecenie, kt\u00f3re spakuj to w plik jar. Nale\u017cy to zrobi\u0107 z poziomu projektu. Zale\u017cnie jakiej linii komend u\u017cywacie, trzeba b\u0119dzie wykona\u0107 jedno z polece\u0144:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Windows powershell<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ncd out; jar -cf ..\/msLib.jar .; cd ..\n<\/pre><\/div>\n\n\n<ul class=\"is-style-default wp-block-list\"><li>Windows CMD<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ncd out &amp; jar -cf ..\/msLib.jar . &amp; cd ..\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Linux<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ncd out &amp;&amp; jar -cf ..\/msLib.jar . &amp;&amp; cd ..\n<\/pre><\/div>\n\n\n<p>W rezultacie pojawi nam si\u0119 plik msLib.jar. W lokalizacji, z kt\u00f3rej uruchamiamy mock-server, tworzy folder libs. Umieszczamy w nim nasz plik msLib.jar. Nast\u0119pnie, we wcze\u015bniej utworzonym pliku init.json, dodajemy now\u0105 konfiguracj\u0119, gdzie oczekiwana odpowied\u017a b\u0119dzie zwr\u00f3cona przez nasze klasy. Plik init.json powinien wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n&#x5B;{\n\"httpRequest\": {\n\"method\":\"GET\",\n\"path\":\"\/some\/path\"\n},\n\"httpResponse\": {\n\"headers\": {\n\"content-type\": &#x5B;\"applications\/json\"]\n},\n\"body\":{\n\"field\":\"value\",\n\"field\":\"value2\"\n}\n}\n},\n{\n\"httpRequest\" : {\n\"path\" : \"\/myResponse1\"\n},\n\"httpResponseClassCallback\" : {\n\"callbackClass\" : \"mockserver.response.SampleResponse\"\n}\n},\n{\n\"httpRequest\" : {\n\"path\" : \"\/myResponse2\"\n},\n\"httpResponseClassCallback\" : {\n\"callbackClass\" : \"mockserver.response.SampleResponse2\"\n}\n}]\n<\/pre><\/div>\n\n\n<p>Jak wida\u0107, w przypadku, gdy odpowied\u017a ma by\u0107 dynamicznie generowana przez klas\u0119, sekcja httpResponse zmieni\u0142a si\u0119 w sekcj\u0119 httpResponseClassCallback z jednym polem callbackClass, gdzie podana jest klasa wraz z pakietem.<\/p>\n\n\n\n<p>Folder z mock-server powinien mie\u0107 nast\u0119puj\u0105c\u0105 zawarto\u015b\u0107:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-3-2.png\"><img decoding=\"async\" width=\"302\" height=\"118\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-3-2.png\" alt=\"\" class=\"wp-image-18451\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-3-2.png 302w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-3-2-300x117.png 300w\" sizes=\"(max-width: 302px) 100vw, 302px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Plik mockserver.properties powinien zawiera\u0107 nast\u0119puj\u0105c\u0105 tre\u015b\u0107:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nmockserver.logLevel=INFO\nmockserver.disableLogging=false\nmockserver.disableSystemOut=false\nmockserver.initializationJsonPath=init.json\nmockserver.watchInitializationJson=true\n<\/pre><\/div>\n\n\n<p>Ostatnim etapem jest uruchomienie aplikacji tak, aby wczyta\u0142a do swojej \u015bcie\u017cki uruchomieniowej pliki z lokalizacji libs\/*. Aby to osi\u0105gn\u0105\u0107, trzeba uruchomi\u0107 mock-server, u\u017cywaj\u0105c komendy -cp zamiast -jar. Komenda wygl\u0105da nast\u0119puj\u0105co.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Java 8<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava -Dmockserver.propertyFile=mockserver.properties -cp \"mockserver-netty-5.12.0-shaded.jar;libs\/*\" org.mockserver.cli.Main -serverPort 1080,1081\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Java 9+<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava --add-exports=java.base\/sun.security.x509=ALL-UNNAMED --add-exports=java.base\/sun.security.util=ALL-UNNAMED -Dmockserver.propertyFile=mockserver.properties -cp \"mockserver-netty-5.12.0-shaded.jar;libs\/*\" org.mockserver.cli.Main -serverPort 1080,1081\n<\/pre><\/div>\n\n\n<p>Po uruchomieniu i&nbsp;<a href=\"http:\/\/localhost:1080\/MyResponse1%20i%20%20http:\/localhost:1080\/MyResponse2\" rel=\"nofollow\" >wykonaniu zapytania POST pod adres<\/a>&nbsp;otrzymamy w odpowiedzi kod 200 lub 500, a w ciele \u017c\u0105dania to, co wys\u0142ali\u015bmy.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-4-2.png\"><img decoding=\"async\" width=\"828\" height=\"385\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-4-2.png\" alt=\"\" class=\"wp-image-18453\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-4-2.png 828w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-4-2-300x139.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-4-2-768x357.png 768w\" sizes=\"(max-width: 828px) 100vw, 828px\" \/><\/a><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-5-1.png\"><img decoding=\"async\" width=\"817\" height=\"403\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-5-1.png\" alt=\"\" class=\"wp-image-18455\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-5-1.png 817w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-5-1-300x148.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-5-1-768x379.png 768w\" sizes=\"(max-width: 817px) 100vw, 817px\" \/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Mock-server \u2013 w\u0142asny certyfikat i w\u0142\u0105czenie mTLS<\/h2>\n\n\n\n<p>Komunikacja szyfrowana jest w dzisiejszych czasach standardem i mock-server tak\u017ce j\u0105 wspiera.&nbsp;<a href=\"https:\/\/github.com\/mock-server\/mockserver\/blob\/master\/mockserver-core\/src\/main\/resources\/org\/mockserver\/socket\/CertificateAuthorityCertificate.pem\" rel=\"nofollow\" >Domy\u015blnie mock-server przedstawia si\u0119 certyfikatem<\/a>. Lepszym rozwi\u0105zaniem jest jednak podanie w\u0142asnego certyfikatu. W artykule przedstawi\u0119, jak wygenerowa\u0107 w\u0142asne CA, certyfikat i jak go podpisa\u0107 naszym CA. Poka\u017c\u0119 tak\u017ce, jak przygotowa\u0107 ju\u017c istniej\u0105cy certyfikat tak, \u017ceby obs\u0142u\u017cy\u0142 go mock-server.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Generowanie w\u0142asnego certyfikatu<\/h3>\n\n\n\n<p>Na potrzeby lokalnych test\u00f3w stworzymy w\u0142asne CA, a nast\u0119pnie certyfikat, kt\u00f3ry zostanie nim podpisany. Wszystko z u\u017cyciem openssl (na systemie Windows polecam wykorzysta\u0107 do tego zadania WSL).<\/p>\n\n\n\n<p>W pierwszym kroku w wybranej lokalizacji stworzymy certyfikat CA z u\u017cyciem poni\u017cszych komend.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nopenssl genrsa -des3 -out rootCA.key 4096\nopenssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt\n<\/pre><\/div>\n\n\n<p>Nast\u0119pnie tworzymy folder i generujemy certyfikaty dla mock-servera.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nmkdir mockserver\nopenssl genrsa -out mockserver\/mockserver.key 2048\nopenssl req -new -sha256 -key mockserver\/mockserver.key -subj \"\/C=PL\/ST=CA\/O=MyOrgMock, Inc.\/CN=localhost\" -out mockserver\/mockserver.csr\nopenssl x509 -req -in mockserver\/mockserver.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out mockserver\/mockserver.crt -days 500 -sha256\n<\/pre><\/div>\n\n\n<p>Na nieszcz\u0119\u015bcie mock-server nie jest w stanie obs\u0142u\u017cy\u0107 naszego certyfikatu i klucza w domy\u015blnym formacie. Musimy wi\u0119c skonwertowa\u0107 certyfikat do formatu PEM, a klucz prywatny do PKCS#8. Mo\u017cna to zrobi\u0107 poni\u017cszymi komendami:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nopenssl pkcs8 -topk8 -inform PEM -in mockserver\/mockserver.key -out mockserver\/mockserver.pksc8.pem -nocrypt\nopenssl x509 -in mockserver\/mockserver.crt -out mockserver\/mockserver.crt.pem -outform PEM\n<\/pre><\/div>\n\n\n<p>Ostatnim etapem jest skonwertowanie naszego certyfikatu rootCa.crt, kt\u00f3rym podpisali\u015bmy certyfikat dla mock-servera, do formatu PEM. Dzi\u0119ki temu mock-server b\u0119dzie akceptowa\u0142 wszystkie certyfikaty, kt\u00f3re s\u0105 nim podpisane.<\/p>\n\n\n\n<p>Mo\u017cna to zrobi\u0107 poni\u017csz\u0105 komend\u0105:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nopenssl x509 -in rootCA.crt -out rootCA.pem -outform PEM\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Konwersja istniej\u0105cego certyfikatu<\/h2>\n\n\n\n<p>Mo\u017ce si\u0119 zdarzy\u0107, \u017ce posiadamy w\u0142asny CA lub dostajemy gotowe certyfikaty do aplikacji, kt\u00f3ra b\u0119dzie dzia\u0142a\u0107 na ho\u015bcie. W tym wypadku wystarczy przekonwertowa\u0107 certyfikat do formatu PEM i dodatkowo wygenerowany klucz skonwertowa\u0107 do PKCS#8. Poni\u017cej przyk\u0142ad konwersji certyfikatu w formacie p12.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nopenssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys\nopenssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes\nopenssl pkcs8 -topk8 -inform PEM -in newfile.key.pem -out newfile.key.pkcs8.pem -nocrypt\n<\/pre><\/div>\n\n\n<p>Trzeba tak\u017ce doda\u0107 CA, kt\u00f3rym zosta\u0142y podpisane nasze certyfikaty. W tym wypadku wystarczy go tylko skonwertowa\u0107 do formatu PEM. Poni\u017cej przyk\u0142ad konwersji z formatu .cer do .pem<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nopenssl x509 -inform der -in certificate.cer -out certificate.pem\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Konfiguracje mtls<\/h2>\n\n\n\n<p>Gdy ju\u017c posiadamy certyfikaty w poprawnych formatach, umieszczamy je w folderze config, kt\u00f3ry nale\u017cy utworzy\u0107 w tej samej lokalizacji, co nasz\u0105 aplikacj\u0119 mock-servera. B\u0119d\u0105 to nast\u0119puj\u0105ce pliki:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nrootCA.pem\nmockserver\/mockserver.crt.pem\nmockserver\/mockserver.pksc8.pem\n<\/pre><\/div>\n\n\n<p>Do pliku mockserver.properties nale\u017cy doda\u0107 dodatkowe parametry, z zachowaniem tych, kt\u00f3re zosta\u0142y do\u0142\u0105czone we wcze\u015bniejszej cz\u0119\u015bci artyku\u0142u.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n#Wymuszenie mutualTLS\nmockserver.tlsMutualAuthenticationRequired=false\n#Certyfikat root\nmockserver.certificateAuthorityCertificate=config\/rootCA.pem\n#Certyfikat dla mock-server\u2019a\nmockserver.privateKeyPath=config\/private_key_PKCS_8.pem\nmockserver.x509CertificatePath=config\/localhost.pem\n<\/pre><\/div>\n\n\n<p>Parametr mockserver.tlsMutualAuthenticationRequired wymusza mutual TLS. Po jego ustawieniu na true nie b\u0119dziemy mieli mo\u017cliwo\u015bci \u0142\u0105czy\u0107 si\u0119 z mock-serverem po porcie http, ani po porcie https z poziomu przegl\u0105darki.<\/p>\n\n\n\n<p>Folder z nasz\u0105 aplikacj\u0105 powinien wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-6-1.png\"><img decoding=\"async\" width=\"281\" height=\"89\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-6-1.png\" alt=\"\" class=\"wp-image-18457\"\/><\/a><\/figure><\/div>\n\n\n\n<p>Aplikacj\u0119 uruchamiamy tak jak we wcze\u015bniejszej cz\u0119\u015bci artyku\u0142u z u\u017cyciem komendy:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Dla javy 8<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava -Dmockserver.propertyFile=mockserver.properties -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Dla javy 9+<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\njava --add-exports=java.base\/sun.security.x509=ALL-UNNAMED --add-exports=java.base\/sun.security.util=ALL-UNNAMED -Dmockserver.propertyFile=mockserver.properties -jar mockserver-netty-5.12.0-shaded.jar -serverPort 1080\n<\/pre><\/div>\n\n\n<p>Istnieje mo\u017cliwo\u015b\u0107&nbsp;<a href=\"https:\/\/localhost:1080\/mockserver\/dashboard\" rel=\"nofollow\" >sprawdzenia, czy mock-server przedstawia si\u0119 teraz naszym certyfikatem<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-7-1.png\"><img decoding=\"async\" width=\"571\" height=\"582\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-7-1.png\" alt=\"\" class=\"wp-image-18459\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-7-1.png 571w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-7-1-294x300.png 294w\" sizes=\"(max-width: 571px) 100vw, 571px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Kolejn\u0105 rzecz\u0105 jest sprawdzenie czy mutualTLS dzia\u0142a poprawnie. Po zmianie parametru mockserver.tlsMutualAuthenticationRequired na true i restarcie aplikacji nie b\u0119dziemy mieli mo\u017cliwo\u015bci wej\u015bcia na wcze\u015bniejszy adres, poniewa\u017c nasza przegl\u0105darka nie przedstawia si\u0119 \u017cadnym certyfikatem, a ka\u017cde \u017c\u0105danie z niepoprawnym certyfikatem b\u0119dzie odrzucane.<\/p>\n\n\n\n<p>Do przetestowania dzia\u0142ania mTls wykorzystam postmana. Na potrzeby test\u00f3w wygenerowa\u0142em nowy certyfikat analogicznie jak dla mock-servera i podpisa\u0142em go stworzonym lokalnie CA. Mo\u017cna tak\u017ce wykorzysta\u0107 certyfikat wygenerowany dla mock-servera.<\/p>\n\n\n\n<p>Aby skonfigurowa\u0107 aplikacj\u0119 postman, nale\u017cy wej\u015b\u0107 w: File -&gt; settings -&gt; Certificates, a nast\u0119pnie w\u0142\u0105czy\u0107 parametr CACertificates i poda\u0107 tam nasz plik rootCA, za\u015b w sekcji&nbsp;<em>Client certificates<\/em>&nbsp;doda\u0107 nowy certyfikat. Nale\u017cy wskaza\u0107 plik CRT i klucz prywatny, a host ustawi\u0107 na adres, na kt\u00f3rym dzia\u0142a mock-server.<\/p>\n\n\n\n<p>W moim przypadku wygl\u0105da to nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-8-1.png\"><img decoding=\"async\" width=\"720\" height=\"415\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-8-1.png\" alt=\"\" class=\"wp-image-18461\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-8-1.png 720w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Ryc.-8-1-300x173.png 300w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Po wykonaniu \u017c\u0105dania na nieskonfigurowany endpoint dostaniemy domy\u015bln\u0105 odpowied\u017a 404.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Mock-server daje du\u017ce mo\u017cliwo\u015bci stworzenia ca\u0142ego systemu umo\u017cliwiaj\u0105c lokalne sprawdzenie dzia\u0142ania proces\u00f3w, jak i mo\u017cliwo\u015b\u0107 stworzenie test\u00f3w integracyjnych z uwzgl\u0119dnieniem brzegowych przypadk\u00f3w. W prosty spos\u00f3b mo\u017cna tak\u017ce wymusi\u0107 mTls, dzi\u0119ki czemu jeszcze dok\u0142adniej mo\u017cemy odwzorowa\u0107 system produkcyjny lokalnie.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli chcesz&nbsp;<a href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-co-to-jest\/\">rozpocz\u0105\u0107 swoj\u0105 przygod\u0119 z Dockerem<\/a>&nbsp;lub interesuj\u0105 Ci\u0119 informacje&nbsp;<a href=\"https:\/\/sii.pl\/blog\/introduction-to-kubernetes-k8s\/\">dotycz\u0105ce wprowadzenia do Kubernetes<\/a>, zach\u0119camy do przeczytania innych artyku\u0142\u00f3w naszych ekspert\u00f3w.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;14140&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;6&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Mock-server \u2013 co to jest i dlaczego warto pozna\u0107 go lepiej?&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Standardem w tworzeniu system\u00f3w staj\u0105 si\u0119 mikroserwisy, w kt\u00f3rych dzia\u0142anie aplikacji jest cz\u0119sto zale\u017cne od dost\u0119pno\u015bci innych aplikacji. Nastr\u0119cza to &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/mock-server-co-to-jest-i-dlaczego-warto-poznac-go-lepiej\/\">Continued<\/a><\/p>\n","protected":false},"author":376,"featured_media":19791,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[287,330,1284,1302],"class_list":["post-14140","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-software-development","tag-java","tag-json","tag-mock-server"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/07\/Mock-server-\u2013-co-to-jest-i-dlaczego-warto-poznac-go-lepiej.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14140"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/376"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=14140"}],"version-history":[{"count":4,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14140\/revisions"}],"predecessor-version":[{"id":19794,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/14140\/revisions\/19794"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19791"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=14140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=14140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=14140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}