{"id":22468,"date":"2023-06-28T05:00:00","date_gmt":"2023-06-28T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=22468"},"modified":"2024-07-22T14:53:48","modified_gmt":"2024-07-22T12:53:48","slug":"biblioteka-mockk-idealne-narzedzie-do-testowania-aplikacji-napisanych-w-kotlinie","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/biblioteka-mockk-idealne-narzedzie-do-testowania-aplikacji-napisanych-w-kotlinie\/","title":{"rendered":"Biblioteka MockK \u2013 idealne narz\u0119dzie do testowania aplikacji napisanych w Kotlinie?"},"content":{"rendered":"\n<p>W 2017 roku j\u0119zyk Kotlin zosta\u0142 og\u0142oszony jednym z oficjalnych j\u0119zyk\u00f3w programowania na platformie Android. Dzi\u0119ki tej decyzji w bardzo kr\u00f3tkim czasie sta\u0142 si\u0119 popularny i uwielbiany przez programist\u00f3w. Jego sk\u0142adnia znacz\u0105co r\u00f3\u017cni\u0142a si\u0119 od j\u0119zyka JAVA \u2013 na tyle, aby cz\u0119\u015b\u0107 programist\u00f3w zacz\u0119\u0142a zastanawia\u0107 si\u0119, czy jego mo\u017cliwo\u015bci da si\u0119 wykorzysta\u0107 r\u00f3wnie\u017c w testach.<\/p>\n\n\n\n<p>Z czasem zacz\u0119\u0142y powstawa\u0107 biblioteki do pisania test\u00f3w, w kt\u00f3rych wykorzystywano mo\u017cliwo\u015bci j\u0119zyka Kotlin. Jedn\u0105 z nich jest w\u0142a\u015bnie biblioteka MockK, kt\u00f3r\u0105 przybli\u017cymy w artykule.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Konfiguracja biblioteki MockK<\/strong><\/h2>\n\n\n\n<p>Poni\u017cej znajduje si\u0119 konfiguracja biblioteki:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/1-1.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/1-1.png\" alt=\"Konfiguracja bliblioteki MockK\" class=\"wp-image-22469\" width=\"635\" height=\"475\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/1-1.png 923w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/1-1-300x225.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/1-1-768x576.png 768w\" sizes=\"(max-width: 635px) 100vw, 635px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Konfiguracja bliblioteki MockK<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Po co testowa\u0107?<\/strong>&nbsp;<\/h2>\n\n\n\n<p>Na pocz\u0105tku mo\u017cemy sobie zada\u0107 pytanie \u2013 po co w og\u00f3le s\u0105 nam potrzebne te testy? Na potrzeby artyku\u0142u napisali\u015bmy kod (dodany poni\u017cej), kt\u00f3ry s\u0142u\u017cy do pobierania lokalnego czasu w milisekundach. Mo\u017cemy by\u0107 przekonani, \u017ce jest on przygotowany poprawnie i zawsze b\u0119dzie dzia\u0142a\u0107.<\/p>\n\n\n\n<p>I by\u0107 mo\u017ce tak rzeczywi\u015bcie b\u0119dzie, ale, b\u0119d\u0105c profesjonalistami, musimy upewni\u0107 si\u0119 podw\u00f3jnie, \u017ce nawet po edycji wszystko zadzieje si\u0119 tak, jak sobie to za\u0142o\u017cyli\u015bmy. W\u0142a\u015bnie dlatego powstaj\u0105 testy. <\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/2.png\"><img decoding=\"async\" width=\"755\" height=\"399\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/2.png\" alt=\"kod przygotowany na potrzeby artyku\u0142u\" class=\"wp-image-22471\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/2.png 755w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/2-300x159.png 300w\" sizes=\"(max-width: 755px) 100vw, 755px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jak testowa\u0107 z u\u017cyciem biblioteki MockK?<\/strong><\/h2>\n\n\n\n<p>Aby zamockowa\u0107 nasz DateLocalSource, wykorzystujemy konstrukcj\u0119 mockk&lt;typ obiektu&gt; {}, gdzie w nawiasach klamrowych okre\u015blamy zachowania metod w danym obiekcie. Dzi\u0119ki s\u0142\u00f3wku kluczowemu \u201eevery\u201d, mo\u017cemy okre\u015bli\u0107, co dana metoda ma nam zwr\u00f3ci\u0107 w przypadku jej wywo\u0142ania. Osi\u0105gamy to w poni\u017cszym przyk\u0142adzie dzi\u0119ki s\u0142\u00f3wku kluczowym \u201ereturns\u201c, ale nie jest to jedyna opcja.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/3-1.jpg\"><img decoding=\"async\" width=\"596\" height=\"115\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/3-1.jpg\" alt=\"fragment kodu\" class=\"wp-image-22473\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/3-1.jpg 596w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/3-1-300x58.jpg 300w\" sizes=\"(max-width: 596px) 100vw, 596px\" \/><\/a><\/figure>\n\n\n\n<p>Je\u017celi chcemy zdefiniowa\u0107 bardziej zaawansowane zachowanie, oparte chocia\u017cby na argumentach przekazanych do metody, powinni\u015bmy u\u017cy\u0107 \u201eanswers\u201d, a gdy potrzebujemy, by ta metoda rzuca\u0142a nam wyj\u0105tkiem, wystarczy u\u017cy\u0107 \u201ethrows\u201d.<\/p>\n\n\n\n<p>S\u0105 to podstawowe i najcz\u0119\u015bciej wyst\u0119puj\u0105ce s\u0142owa kluczowe, ale MockK oferuje ich znacznie wi\u0119cej. To niekt\u00f3re z nich:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>just Runs \u2013 definiuje, \u017ce metoda zwraca Unit,<\/li>\n\n\n\n<li>just Awaits \u2013 definiuje, \u017ce metoda nigdy nic nie zwraca,<\/li>\n\n\n\n<li>returnsMany \u2013 pozwala na definiowanie sekwencji warto\u015bci, kt\u00f3re maj\u0105 by\u0107 zwracane przez wywo\u0142ywan\u0105 metod\u0119 w kolejnych wywo\u0142aniach,<\/li>\n\n\n\n<li>throwsMany \u2013 pozwala na definiowanie sekwencji wyj\u0105tk\u00f3w, kt\u00f3re maj\u0105 zosta\u0107 rzucone.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Jak sprawdzi\u0107, czy metoda si\u0119 wywo\u0142a\u0142a?<\/strong><\/h3>\n\n\n\n<p>Wiemy, jak zamockowa\u0107 to, co ma zwr\u00f3ci\u0107 dana metoda. Ale jak sprawdzi\u0107, czy w og\u00f3le ta metoda si\u0119 wywo\u0142a\u0142a? Z pomoc\u0105 przychodzi nam \u201everify\u201d. Wystarczy skorzysta\u0107 z konstrukcji verify { zamockowanyObiekt.metodaKt\u00f3rejWywo\u0142anieChcemySprawdzi\u0107() }, aby test przechodzi\u0142 tylko wtedy, gdy podana metoda zostanie wywo\u0142ana.<\/p>\n\n\n\n<p>Warto pami\u0119ta\u0107, \u017ce gdy wykorzystujemy zwyk\u0142e \u201everify\u201d, to metoda musi zosta\u0107 wywo\u0142ana przynajmniej raz, by weryfikacja przebieg\u0142a pomy\u015blnie. U\u017cycie dodatkowych s\u0142\u00f3wek kluczowych u\u017cywanych w nawiasach \u2013 jak \u201eexactly\u201d \u2013 zostanie wyt\u0142umaczone w p\u00f3\u017aniejszej cz\u0119\u015bci artyku\u0142u.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/4-1.jpg\"><img decoding=\"async\" width=\"590\" height=\"349\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/4-1.jpg\" alt=\"fragment kodu\" class=\"wp-image-22475\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/4-1.jpg 590w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/4-1-300x177.jpg 300w\" sizes=\"(max-width: 590px) 100vw, 590px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Korutyny<\/strong><\/h3>\n\n\n\n<p>Warto wspomnie\u0107 o jednej z wi\u0119kszych <strong>zalet biblioteki<\/strong>, a dok\u0142adniej o tym, \u017ce MockK wspiera jeden z filar\u00f3w j\u0119zyka Kotlin \u2013 <a href=\"https:\/\/sii.pl\/blog\/wyszukiwarka\/korutyny\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">korutyny<\/a>.<\/p>\n\n\n\n<p>W przyk\u0142adowych testach naszego kodu do pobierania czasu ewidentnie wida\u0107, \u017ce metody typu \u201esuspend\u201d maj\u0105 osobny pakiet funkcji do mockowania oraz weryfikacji danych (przedrostek \u201eco\u201d). Dzi\u0119ki temu rozwi\u0105zaniu \u0142atwo da si\u0119 zauwa\u017cy\u0107, gdzie u\u017cywamy takiego typu metod, gdy\u017c z racji specyfiki budowy, wymagaj\u0105 one innego traktowania ni\u017c zwykle metody.<\/p>\n\n\n\n<p><strong>Nasuwa si\u0119 wi\u0119c wniosek:<\/strong> u\u017cywaj\u0105c MockK, nie musimy martwi\u0107 si\u0119 o metody \u201esuspend\u201d, poniewa\u017c wystarczy pami\u0119ta\u0107 o dodaniu przedrostka \u201eco\u201d, kt\u00f3ry pozwoli na ich bezproblemow\u0105 obs\u0142ug\u0119. &nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Domy\u015blnie czy niedomy\u015blnie?<\/strong><\/h2>\n\n\n\n<p>Pierwsz\u0105 bol\u0105czk\u0105, kt\u00f3ra b\u0119dzie wymaga\u0142a naszej decyzji, jest argument \u201erelaxed\u201d u\u017cywany przy definicji mockowanego obiektu. Biblioteka MockK domy\u015blnie NIE mockuje wszystkich metod danego obiektu. Ale w sumie jest to jej wielka zaleta! <\/p>\n\n\n\n<p>Wyobra\u017amy sobie sytuacj\u0119, \u017ce tworzymy now\u0105 metod\u0119 zwracaj\u0105c\u0105 typ Unit i przez pomy\u0142k\u0119 umieszczamy j\u0105 w miejscu, w kt\u00f3rym nie powinno jej by\u0107. W takim przypadku u\u017cycie \u201erelaxed = True\u201d spowoduje, \u017ce test nie b\u0119dzie w stanie wykry\u0107 nieprawid\u0142owo\u015bci, gdy\u017c metoda b\u0119dzie automatycznie zamockowana. <\/p>\n\n\n\n<p>W ka\u017cdej innej sytuacji r\u0119czne wpisane ka\u017cdego \u201eevery\u201d b\u0105d\u017a \u201ecoEvery\u201d dla naszych metod zabezpieczy nas, poniewa\u017c ka\u017cda niezamockowana metoda zwr\u00f3ci b\u0142\u0105d testu. Z tego powodu uwa\u017camy, \u017ce powinni\u015bmy u\u017cywa\u0107 tego argumentu z g\u0142ow\u0105 i tylko w przypadku ch\u0119ci przetestowania konkretnych sytuacji, gdzie nie zwracamy uwagi na inne metody.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/6.png\"><img decoding=\"async\" width=\"756\" height=\"162\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/6.png\" alt=\"fragment kodu\" class=\"wp-image-22477\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/6.png 756w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/6-300x64.png 300w\" sizes=\"(max-width: 756px) 100vw, 756px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nie tylko prosta weryfikacja<\/strong><\/h2>\n\n\n\n<p>\u201eVerify\u201d dzi\u0119ki mo\u017cliwo\u015bci podania argument\u00f3w jest bardzo elastycznym narz\u0119dziem do weryfikacji wywo\u0142a\u0144 metod. Oto najcz\u0119\u015bciej wykorzystywane:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>(exactly = n) \u2013 metoda wywo\u0142ana dok\u0142adnie n razy\u200b,<\/li>\n\n\n\n<li>(atLeast = n) \u2013 metoda wywo\u0142ana minimum n razy\u200b,<\/li>\n\n\n\n<li>(atMost = n) \u2013 metoda wywo\u0142ana maksimum n razy.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/7.jpg\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/7.jpg\" alt=\"fragment kodu\" class=\"wp-image-22479\" width=\"603\" height=\"169\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/7.jpg 605w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/7-300x84.jpg 300w\" sizes=\"(max-width: 603px) 100vw, 603px\" \/><\/a><\/figure>\n\n\n\n<p>MockK oferuje nam jeszcze dodatkowe opcje weryfikowania, kt\u00f3re zosta\u0142y przedstawione na przyk\u0142adach poni\u017cej.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/8.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/8.png\" alt=\"fragment kodu\" class=\"wp-image-22481\" width=\"393\" height=\"425\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/8.png 393w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/8-277x300.png 277w\" sizes=\"(max-width: 393px) 100vw, 393px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/9.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/9.png\" alt=\"fragment kodu\" class=\"wp-image-22483\" width=\"427\" height=\"662\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/9.png 427w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/9-194x300.png 194w\" sizes=\"(max-width: 427px) 100vw, 427px\" \/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>verifyAll \u2013 sprawdza, czy wszystkie zadane metody wywo\u0142a\u0142y si\u0119 bez wzgl\u0119du na kolejno\u015b\u0107\u200b,<\/li>\n\n\n\n<li>verifySequence \u2013 sprawdza, czy wszystkie zadane metody wywo\u0142a\u0142y si\u0119 zgodnie z podan\u0105 sekwencj\u0105\u200b,<\/li>\n\n\n\n<li>verifyOder \u2013 sprawdza, czy wszystkie zadane metody wywo\u0142a\u0142y si\u0119 w podanej kolejno\u015bci\u200b,<\/li>\n\n\n\n<li>wasNot Called \u2013 sprawdza, czy mock (lub lista mock\u00f3w) nie wywo\u0142a\u0142 si\u0119 w og\u00f3le.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>A co z metodami statycznymi?<\/strong><\/h2>\n\n\n\n<p>Statyczne metody to byt, kt\u00f3ry wywo\u0142uje mieszanie uczucia. Nale\u017cy si\u0119 jednak zgodzi\u0107, \u017ce s\u0105 momenty, w kt\u00f3rych jest to ca\u0142kiem przydatne rozwi\u0105zanie. Dlatego wydaje si\u0119 rozs\u0105dne, \u017ce biblioteka MockK postanowi\u0142a domy\u015blnie wesprze\u0107 ten spos\u00f3b pisania kodu.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/10.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/10.png\" alt=\"fragment kodu\" class=\"wp-image-22485\" width=\"756\" height=\"140\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/10.png 756w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/10-300x56.png 300w\" sizes=\"(max-width: 756px) 100vw, 756px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/11.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/11.png\" alt=\"fragment kodu\" class=\"wp-image-22487\" width=\"623\" height=\"347\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/11.png 623w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/11-300x167.png 300w\" sizes=\"(max-width: 623px) 100vw, 623px\" \/><\/a><\/figure>\n\n\n\n<p>We wskazanym przyk\u0142adzie pomy\u015blnie zamockowalismy statyczn\u0105 metod\u0119 \u201egetInstance()\u201d b\u0119d\u0105c\u0105 cz\u0119\u015bci\u0105 klasy Calendar. Gdy ju\u017c jej nie potrzebujemy, u\u017cywamy metody \u201eunmockkStatic(Calendar::class)\u201d, kt\u00f3ra cofa zamockowanie klasy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Spos\u00f3b na prywatne metody?<\/strong><\/h2>\n\n\n\n<p>Czy z architektonicznego punktu widzenia powinno testowa\u0107 si\u0119 dzia\u0142anie\/wywo\u0142anie prywatnych metod? To r\u00f3wnie\u017c kwestia sporna i zale\u017cna od sytuacji.<\/p>\n\n\n\n<p>Niemniej, bardzo dobrze, \u017ce MockK tak\u017ce wspiera to rozwi\u0105zanie i nie wymaga przy tym adnotacji @VisibleForTesting. Wystarczy u\u017cy\u0107 spyka z parametrem \u201erecordPrivateCalls\u201d ustawionym na \u201etrue\u201d, co umo\u017cliwi nam zamockowanie prywatnej metody w spos\u00f3b pokazany poni\u017cej.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/12.jpg\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/12.jpg\" alt=\"fragment kodu\" class=\"wp-image-22489\" width=\"449\" height=\"318\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/12.jpg 449w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/12-300x212.jpg 300w\" sizes=\"(max-width: 449px) 100vw, 449px\" \/><\/a><\/figure>\n\n\n\n<p>O spyku nale\u017cy jednak napisa\u0107 nieco wi\u0119cej, gdy\u017c to rozwi\u0105zanie daje nam du\u017ce pole manewru. W domy\u015ble operujemy na realnym obiekcie, a nie jego mocku, przy czym w dalszym ci\u0105gu mo\u017cemy cze\u015b\u0107 metod zamockowa\u0107, podczas gdy reszta b\u0119dzie operowa\u0142a na realnym kodzie.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>(recordPrviateCalls = true) \u2013 umo\u017cliwia zamockowanie prywatnych metod\u200b,<\/li>\n\n\n\n<li>mock[\u201eaccelerate\u201d]() \u2013 ta konstrukcja pozwala zamockowa\u0107 prywatn\u0105 metod\u0119 accelerate().<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>MockK czy Mockito?<\/strong><\/h2>\n\n\n\n<p>Cz\u0119\u015b\u0107 os\u00f3b mo\u017ce zapyta\u0107, czym jest w og\u00f3le Mockito. Mockito to biblioteka, kt\u00f3ra tak jak MockK umo\u017cliwia testowanie, z t\u0105 r\u00f3\u017cnic\u0105, \u017ce stosuje ona bardziej klasyczn\u0105 sk\u0142adni\u0119 Javy, co dla niekt\u00f3rych mo\u017ce by\u0107 minusem. Szczeg\u00f3lnie, gdy na co dzie\u0144 pisz\u0105 w Kotlinie. W takim przypadku sk\u0142adnia MockK powinna im bardziej przypa\u015b\u0107 do gustu, poniewa\u017c jest bardzo podobna do tej u\u017cywanej w j\u0119zyku Kotlin.<\/p>\n\n\n\n<p>Co szczeg\u00f3lnie przemawia na rzecz u\u017cywania MockK zamiast Mockito? Argumenty przedstawimy w formie tabelki.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>MockK<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Mockito<\/strong><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Nie mockuje domy\u015blnie wszystkich metod<\/td><td class=\"has-text-align-center\" data-align=\"center\">Mockuje domy\u015blnie wszystkie metody<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Wbudowane wsparcie dla korutyn<\/td><td class=\"has-text-align-center\" data-align=\"center\">Brak wbudowanego wsparcia dla korutyn<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Wbudowane mockowanie statycznych metod<\/td><td class=\"has-text-align-center\" data-align=\"center\">Utrudnione mockowanie statycznych metod<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Kod jest bardziej czytelny i przyst\u0119pny<\/td><td class=\"has-text-align-center\" data-align=\"center\">Kod jest mniej czytelny<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Tab. 1 MockK czy Mockito &#8211; zalety i wady narz\u0119dzi<\/figcaption><\/figure>\n\n\n\n<p>Patrz\u0105c na plusy MockK w stosunku do Mockito, naszym zdaniem warto zapozna\u0107 si\u0119 z t\u0105 bibliotek\u0105, szczeg\u00f3lnie, \u017ce jest ju\u017c coraz szerzej stosowana w projektach komercyjnych i w nied\u0142ugim czasie mo\u017ce ca\u0142kowicie wyprze\u0107 Mockito.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Biblioteka MockK oferuje bardzo przyjemny dla oka, wyj\u0105tkowo czytelny spos\u00f3b pisania test\u00f3w. Idealnie nadaje si\u0119 do testowania aplikacji pisanych w Kotlinie. Wypada jeszcze lepiej, gdy do gry wkracza razem z bibliotek\u0105 Kotest ze swoimi kotlinowymi rozwi\u0105zaniami typu infix (kt\u00f3re z reszt\u0105 u\u017cyli\u015bmy w <a href=\"https:\/\/github.com\/pawelkrzeminski89\/mocckapplication\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >przyk\u0142adowej aplikacji napisanej przez nas na potrzeby artyku\u0142u<\/a>. Link do repozytorium, w kt\u00f3rym jest udost\u0119pniona ta aplikacja mo\u017cecie znale\u017a\u0107 poni\u017cej w \u017ar\u00f3d\u0142ach).<\/p>\n\n\n\n<p>W artykule starali\u015bmy si\u0119 skupi\u0107 na podstawach, gdy\u017c oczywiste jest, \u017ce mo\u017cliwo\u015bci biblioteki jest du\u017co wi\u0119cej. Dlatego zach\u0119camy do sprawdzenia <a href=\"http:\/\/www.mockk.io\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >dokumentacji biblioteki MockK<\/a>, kt\u00f3ra r\u00f3wnie\u017c stoi na wysokim poziomie. Po takiej lekturze migracja b\u0119dzie zdecydowanie mniej gro\u017ana ni\u017c nam si\u0119 wydaje \ud83d\ude0a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Materia\u0142y \u017ar\u00f3d\u0142owe<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/www.mockk.io\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Dokumentacja<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/pawelkrzeminski89\/mocckapplication\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Nasza przyk\u0142adowa aplikacja<\/a><\/li>\n<\/ul>\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;22468&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;8&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: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Biblioteka MockK \u2013 idealne narz\u0119dzie do testowania aplikacji napisanych w Kotlinie?&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: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W 2017 roku j\u0119zyk Kotlin zosta\u0142 og\u0142oszony jednym z oficjalnych j\u0119zyk\u00f3w programowania na platformie Android. Dzi\u0119ki tej decyzji w bardzo &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/biblioteka-mockk-idealne-narzedzie-do-testowania-aplikacji-napisanych-w-kotlinie\/\">Continued<\/a><\/p>\n","protected":false},"author":535,"featured_media":22492,"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":[2427,1739,1546,983,1302],"class_list":["post-22468","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-digital","tag-mockk","tag-przeglad-narzedzi","tag-kotlin","tag-mock-server"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/covery-edycja-luty-2023.pptxBiblioteka-MockK-\u2013-idealne-narzedzie-do-testowania-aplikacji-napisanych-w-Kotlinie.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22468"}],"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\/535"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=22468"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22468\/revisions"}],"predecessor-version":[{"id":22501,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22468\/revisions\/22501"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/22492"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=22468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=22468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=22468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}