{"id":647,"date":"2023-11-15T15:15:15","date_gmt":"2023-11-15T14:15:15","guid":{"rendered":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=647"},"modified":"2024-01-16T11:37:15","modified_gmt":"2024-01-16T10:37:15","slug":"stub-mock-i-spy","status":"publish","type":"post","link":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/?p=647","title":{"rendered":"Stub, mock i spy"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"647\" class=\"elementor elementor-647\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f73a8cf elementor-section-full_width elementor-section-stretched elementor-section-height-default elementor-section-height-default\" data-id=\"f73a8cf\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;stretch_section&quot;:&quot;section-stretched&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-333a87b\" data-id=\"333a87b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b95ef01 elementor-widget__width-initial elementor-widget elementor-widget-qi_addons_for_elementor_section_title\" data-id=\"b95ef01\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"qi_addons_for_elementor_section_title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"qodef-shortcode qodef-m  qodef-qi-section-title  qodef-decoration--italic  qodef-link--underline-draw qodef-subtitle-icon--left\">\n\t\t\t\t\t\t<h2 class=\"qodef-m-title\">\n\t\tStub, mock i spy\t<\/h2>\n\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cdfdb5a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cdfdb5a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9315c2d\" data-id=\"9315c2d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-31c0907 elementor-widget elementor-widget-text-editor\" data-id=\"31c0907\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>S\u0105 to obiekty pomocnicze u\u017cywane w testach jednostkowych, kt\u00f3re zast\u0119puj\u0105 prawdziwy obiekt. Pomagaj\u0105 w testowaniu funkcjonalno\u015bci, kt\u00f3re odwo\u0142uj\u0105 si\u0119 do innych klas, czy metod. <\/p><p>W tym artykule spr\u00f3buj\u0119 rozja\u015bni\u0107 r\u00f3\u017cnic\u0119 mi\u0119dzy obiektami z tytu\u0142u i wyjasni\u0107 do czego ka\u017cde z nich mo\u017ce pos\u0142u\u017cy\u0107.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6ea394f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6ea394f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-13fc9d9\" data-id=\"13fc9d9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-089ba15 elementor-widget elementor-widget-heading\" data-id=\"089ba15\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Stub<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6ec4e12 elementor-widget elementor-widget-text-editor\" data-id=\"6ec4e12\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Jest to obiekt zawieraj\u0105cy przyk\u0142adow\u0105 implementacj\u0119 kodu, kt\u00f3rego zachowanie chcemy przetestowa\u0107 i zwracaj\u0105cy okre\u015blone warto\u015bci. U\u017cywamy go kiedy chcemy przetestowa\u0107 konkretny stan naszego programu do cel\u00f3w testowych. Kiedy chcemy przetestowa\u0107 inny stan musimy napisa\u0107 kolejny stub. Jest to zatem dobre rozwi\u0105zanie dla prostych funkcji, w kt\u00f3rych musimy sprawdzi\u0107 tylko jeden scenariusz.<\/p><p>Przyk\u0142ady zastosowania:<\/p><ul><li>nie mamy dost\u0119pu do prawdziwej metody zwracaj\u0105cej dane<\/li><li>nie chcemy anga\u017cowa\u0107 obiekt\u00f3w, kt\u00f3re zwr\u00f3ci\u0142yby prawdziwe dane, co mog\u0142oby mie\u0107 niekorzystne skutki uboczne (np. modyfikacja danych w bazie danych)<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-23dfe6d elementor-widget elementor-widget-heading\" data-id=\"23dfe6d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Przyk\u0142ad<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f089350 elementor-widget elementor-widget-text-editor\" data-id=\"f089350\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Tworzymy katalog do zarz\u0105dzania danymi z biblioteki. Nasz program na razie zawiera nast\u0119puj\u0105ce klasy:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc1f7aa elementor-widget elementor-widget-text-editor\" data-id=\"dc1f7aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>Book &#8211; odzwierciedla nam uproszczon\u0105 klas\u0119 odzwierciedlaj\u0105c\u0105 ksi\u0105\u017ck\u0119<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0036268 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"0036268\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>public class Book {\n    String name;\n    BookStatus bookStatus;\n\n    public Book(String name) {\n        this.name = name;\n        bookStatus = BookStatus.AVAIBLE;\n    }\n\n    public BookStatus getBookStatus() {\n        return bookStatus;\n    }\n\n    public void setBookStatus(BookStatus bookStatus) {\n        this.bookStatus = bookStatus;\n    }\n\n    public String getName() {\n        return name;\n    }\n    public boolean isAvailable(){\n        if(this.getBookStatus() == BookStatus.AVAIBLE){\n            return true;\n        }\n        return false;\n    }\n\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6804c75 elementor-widget elementor-widget-text-editor\" data-id=\"6804c75\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>LibraryRepository &#8211; interfejs, kt\u00f3ry pozwala nam zaimplementowa\u0107 kod do pobierania danych z katalogu<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dd9cfd8 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"dd9cfd8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>public interface LibraryRepository {\n    List&lt;Book&gt; getAllBooks();\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d37722 elementor-widget elementor-widget-text-editor\" data-id=\"8d37722\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>LibraryService &#8211; klasa, kt\u00f3ra s\u0142u\u017cy do zwracania nam wybranych wynik\u00f3w pos\u0142uguj\u0105c si\u0119 danymi zwracanymi przez z klasy implentuj\u0105cej klas\u0119 LibraryRepository<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-252d61f elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"252d61f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>public class LibraryService {\n    LibraryRepository libraryRepository;\n\n    public LibraryService(LibraryRepository libraryRepository) {\n        this.libraryRepository = libraryRepository;\n    }\n\n    public List&lt;Book&gt; getAllAvailableBooks(){\n        return libraryRepository.getAllBooks().stream()\n                .filter(Book::isAvailable)\n                .collect(Collectors.toList());\n    }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-449c283 elementor-widget elementor-widget-text-editor\" data-id=\"449c283\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Pr\u00f3bujemy teraz przetstowa\u0107 metod\u0119 getAllAvailableBooks z klasy LibraryService jednak nie posiadam b\u0105d\u017a nie chc\u0119 korzysta\u0107 z implementacji i tu potrzebny jest nam stub, kt\u00f3ry zwr\u00f3ci nam przyk\u0142adow\u0105 list\u0119 ksi\u0105\u017cek. Mo\u017cemy to zrobi\u0107 na przyk\u0142ad tworz\u0105c osobn\u0105 klas\u0119: <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-899c0b7 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"899c0b7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>public class LibraryRepositoryStub implements LibraryRepository{\n    @Override\n    public List&lt;Book&gt; getAllBooks() {\n        Book book1 = new Book(&quot;Dr. Dolittle&quot;);\n        \n        Book book2 = new Book(&quot;Dzieci z Bullerbyn&quot;);\n        book2.setBookStatus(BookStatus.RENTED);\n        \n        Book book3 = new Book(&quot;Pippi Po\u0144czoszanka&quot;);\n        \n        return Arrays.asList(book1, book2, book3);\n    }\n\n    @Override\n    public List&lt;Book&gt; getByName(String name) {\n        return null;\n    }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6ce0c7c elementor-widget elementor-widget-text-editor\" data-id=\"6ce0c7c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>W te\u015bcie skorzystamy teraz z naszego stuba:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-372d2a7 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"372d2a7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>class LibraryServiceTest {\n    @Test\n    void getAllActiveAccounts() {\n        \/\/given\n        LibraryRepository libraryRepositoryStub = new LibraryRepositoryStub();\n        LibraryService libraryService = new LibraryService(libraryRepositoryStub);\n\n        \/\/when\n        List&lt;Book&gt; booksList = libraryService.getAllAvailableBooks();\n\n        \/\/then\n        assertEquals(2, booksList.size());\n    }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd38005 elementor-widget elementor-widget-text-editor\" data-id=\"cd38005\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Czyli przes\u0142ali\u015bmy w stubie z g\u00f3ry okre\u015blone dane, \u017ceby sprawdzi\u0107, czy nasza metoda getAllAvailableBooks oddzieli ksi\u0105\u017cki dost\u0119pne od innych.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f38aa0e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f38aa0e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-264b05e\" data-id=\"264b05e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fc6e553 elementor-widget elementor-widget-heading\" data-id=\"fc6e553\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Mock<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-24f6570 elementor-widget elementor-widget-text-editor\" data-id=\"24f6570\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Jest to obiekt, kt\u00f3ry w kontrolowany spos\u00f3b symuluje zachowanie rzeczywistego obiektu. Warto rozwa\u017cy\u0107 jego u\u017cycie kiedy rzeczywisty obiekt:<\/p>\n<ul>\n<li>&nbsp;zwraca wyniki, kt\u00f3re odnosz\u0105 si\u0119 do stanu obecnego w danym momencie (np. aktualny czas, temperatura)<\/li>\n<li>ma stany, kt\u00f3re s\u0105 trudne do wywo\u0142ania lub zreplikowania (np. b\u0142\u0105d sieciowy)<\/li>\n<li>jest powolny (np. kompletna baza danych wymagaj\u0105ca inicjalizacji przed testem)<\/li>\n<li>jeszcze nie istnieje lub jego zachowanie mo\u017ce si\u0119 zmieni\u0107<\/li>\n<li>wymaga\u0142by do\u0142\u0105czenia informacji i metod przeznaczonych wy\u0142\u0105cznie do test\u00f3w, a nie do realizacji celu, dla kt\u00f3rego powsta\u0142<\/li>\n<\/ul>\n<div>Oczekujemy od niego, \u017ce zweryfikuje wywo\u0142anie odpowiednich metod<br><\/div>\n<ul>\n<\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a2f03f4 elementor-widget elementor-widget-heading\" data-id=\"a2f03f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Przyk\u0142ad<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8a9b329 elementor-widget elementor-widget-text-editor\" data-id=\"8a9b329\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Powiedzmy, \u017ce do naszego poprzedniego przyk\u0142adu do klasy LibraryService chcemy doda\u0107 metod\u0119 umo\u017cliwiaj\u0105c\u0105 u\u017cytkownikowi wypo\u017cyczenie ksi\u0105\u017cki.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-788a1c2 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"788a1c2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>public void rentBook(String name){\n    Book book = libraryRepository.getByName(name);\n    if(book.isAvailable()){\n        book.setBookStatus(BookStatus.RENTED);\n    } else {\n        throw new NoSuchElementException();\n    }\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-95d6fdf elementor-widget elementor-widget-text-editor\" data-id=\"95d6fdf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Chcemy sprawdzi\u0107, czy po wypo\u017cyczeniu ksi\u0105\u017cki zmieni si\u0119 jej status, jednak nie mamy dost\u0119pu do klasy implementuj\u0105cej LibraryRepository, kt\u00f3rej metod\u0119 wykorzystuje powy\u017csza funkcja. Dlatego stworzymy z niej mock&#8217;a<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc03c1a elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"dc03c1a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>@Test\nvoid rentBookShouldChangeItStatus() {\n    \/\/given\n    LibraryRepository libraryRepository = mock(LibraryRepository.class);\n    LibraryService libraryService = new LibraryService(libraryRepository);\n    String bookName = &quot;Dzieci z Bullerbyn&quot;;\n    Book book = new Book(bookName);\n\n    given(libraryRepository.getByName(bookName)).willReturn(book);\n\n    \/\/when\n    libraryService.rentBook(bookName);\n\n    \/\/then\n    assertEquals(BookStatus.RENTED, book.getBookStatus());\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b23941b elementor-widget elementor-widget-heading\" data-id=\"b23941b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Kiedy u\u017cywa\u0107 mock'a?<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c1da190 elementor-widget elementor-widget-text-editor\" data-id=\"c1da190\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>wyizolowanie zale\u017cno\u015bci w kodzie i wyspecyfikowanie ich zachowania<\/li><li>stworzenie zale\u017cno\u015bci, aby sprawdzi\u0107 interakcje testowanej klasy z nimi<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-99b8b2b elementor-widget elementor-widget-heading\" data-id=\"99b8b2b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Kiedy nie u\u017cywa\u0107 mock'a?<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2fec659 elementor-widget elementor-widget-text-editor\" data-id=\"2fec659\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>do danych testowych oraz obiekt\u00f3w Value<\/li><li>do kodu bibliotek<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2ab912a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2ab912a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-587d19f\" data-id=\"587d19f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8ae920e elementor-widget elementor-widget-heading\" data-id=\"8ae920e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Spy<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5e81db4 elementor-widget elementor-widget-text-editor\" data-id=\"5e81db4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Obiekt podobny do mock&#8217;a, poniewa\u017c jego dzia\u0142anie mo\u017cemy \u015bledzi\u0107 i weryfikowa\u0107, a metody mockowa\u0107. R\u00f3\u017cnica mi\u0119dzy nim, a mockiem polega na tym, \u017ce mo\u017cna na nim tak\u017ce wywo\u0142ywa\u0107 prawdziwe metody.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d9b6141 elementor-widget elementor-widget-heading\" data-id=\"d9b6141\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Przyk\u0142ad<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3b1d73d elementor-widget elementor-widget-text-editor\" data-id=\"3b1d73d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Powiedzmy, \u017ce chcemy przetestowa\u0107 klas\u0119 Book i sprawdzi\u0107, czy po zmianie BookStatus funkcja IsAvailable zadzia\u0142a<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76b9c54 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"76b9c54\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>@Test\nvoid bookShouldBeNotAvailableAfterChangeBookStatusToRented() {\n    Book book = spy(new Book(&quot;Dzieci z Bullerbyn&quot;));\n\n    given(book.getBookStatus()).willReturn(BookStatus.RENTED);\n\n    assertFalse(book.isAvailable());\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0c1150b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0c1150b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-44d1258\" data-id=\"44d1258\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-58762e6 elementor-widget elementor-widget-heading\" data-id=\"58762e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Verify<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d147138 elementor-widget elementor-widget-text-editor\" data-id=\"d147138\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Metoda w bibliotece Mockito s\u0142u\u017c\u0105ca do weryfikacja wywo\u0142a\u0144 metod na mock i spy. Czyli umo\u017cliwia sprawdzenie, czy stworzony mock\/spy wywo\u0142a metody obiektu, kt\u00f3ry udaje.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c26b664 elementor-widget elementor-widget-heading\" data-id=\"c26b664\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Przyk\u0142ad<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b46d933 elementor-widget elementor-widget-text-editor\" data-id=\"b46d933\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Mogliby\u015bmy u\u017cy\u0107 tej metody w nieco zmodyfikowanym te\u015bcie z poprzedniego przyk\u0142adu, czyli:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5311a46 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"5311a46\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>@Test\nvoid bookShouldBeNotAvailableAfterChangeBookStatusToRented() {\n    Book book = spy(new Book(&quot;Dzieci z Bullerbyn&quot;));\n\n    given(book.getBookStatus()).willReturn(BookStatus.RENTED);\n\n    boolean result = book.isAvailable();\n\n    verify(book).getBookStatus();\n    assertFalse(result);\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ba4b1c6 elementor-widget elementor-widget-heading\" data-id=\"ba4b1c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Krotno\u015b\u0107 verify<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-cb7444a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cb7444a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-6ca1c0c\" data-id=\"6ca1c0c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b462f9d elementor-widget elementor-widget-text-editor\" data-id=\"b462f9d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>U\u017cywaj\u0105c metody verify mo\u017cemy modyfikowa\u0107 ilo\u015b\u0107 wywo\u0142a\u0144, czy interakcji za pomoc\u0105 metod podawanych jako drugi, opcjonalny argument. Przyk\u0142ady:<\/p><ul><li>times(int) &#8211; okre\u015bla ile razy mia\u0142a zosta\u0107 wywo\u0142ana dana metoda podczas sprawdzania danej funkcji<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7f8312c elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"7f8312c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>verify(book, times(1)).getBookStatus(); <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-b9933be elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b9933be\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-3e053fb\" data-id=\"3e053fb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f8cf938 elementor-widget elementor-widget-text-editor\" data-id=\"f8cf938\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>atMost(int) &#8211; okre\u015bla ile najwi\u0119cej razy mia\u0142aby by\u0107 u\u017cyta dana funkcja<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9a9b1e2 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"9a9b1e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>verify(book, atMost(3)).getBookStatus(); <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-19deebe elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"19deebe\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-dc14dba\" data-id=\"dc14dba\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cb5def1 elementor-widget elementor-widget-text-editor\" data-id=\"cb5def1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>atLeast(int) &#8211; okre\u015bla ile conajmniej razy mia\u0142a zosta\u0107 u\u017cyta dana funkcja<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86366c2 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"86366c2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>verify(book, atLeast(2)).getBookStatus(); <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-c002d23 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c002d23\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-2a4f861\" data-id=\"2a4f861\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fbc8c47 elementor-widget elementor-widget-text-editor\" data-id=\"fbc8c47\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>never() &#8211; sprawdza, czy nie dosz\u0142o do interakcji z dan\u0105 metod\u0105<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce063ad elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"ce063ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>verify(book, never()).getBookStatus(); <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-ec4ddf6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ec4ddf6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-f46435c\" data-id=\"f46435c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3b805b8 elementor-widget elementor-widget-text-editor\" data-id=\"3b805b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Istniej\u0105 r\u00f3wnie\u017c inne metody u\u017cywane zamiast verify() sprawdzaj\u0105ce, czy nie dosz\u0142o do interakcji<\/p><ul><li>verifyZeroInteractions() &#8211; sprawdza, czy nie dosz\u0142o do \u017cadnej interakcji<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2f7c68c elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"2f7c68c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>verifyZeroInteractions(book); <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-ca4795a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ca4795a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-f9299d9\" data-id=\"f9299d9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-58aa59c elementor-widget elementor-widget-text-editor\" data-id=\"58aa59c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li>verifyNoMoreInteractions() &#8211; sprawdza, czy mock\/spy nie b\u0119dzie wi\u0119cej wywo\u0142ywany<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-84e71c2 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"84e71c2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>verifyNoMoreInteractions(book); <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-865cfb7 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"865cfb7\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-e32e551\" data-id=\"e32e551\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f498da6 elementor-widget elementor-widget-text-editor\" data-id=\"f498da6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Za pomoc\u0105 klasy InOrder mo\u017cna dodatkowo sprawdzi\u0107, czy interakcje zasz\u0142y w konkretnej kolejno\u015bci. Dzia\u0142a ona dla jednego i wielu mock\u00f3w.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9a828c4 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"9a828c4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-java'>@Test\nvoid bookShouldBeNotAvailableAfterChangeBookStatusToRented() {\n    Book book = spy(new Book(&quot;Dzieci z Bullerbyn&quot;));\n\n    boolean result = book.isAvailable();\n\n    verify(book, times(1)).getBookStatus();\n    assertTrue(result);\n\n    InOrder inOrder = inOrder(book);\n    inOrder.verify(book).isAvailable();\n    inOrder.verify(book).getBookStatus();\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2c2dc87 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2c2dc87\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7a80756\" data-id=\"7a80756\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0ff3213 elementor-widget elementor-widget-heading\" data-id=\"0ff3213\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Podsumowanie<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-90ba4a4 elementor-widget elementor-widget-text-editor\" data-id=\"90ba4a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>W powy\u017cszym artykule stara\u0142am si\u0119 jak najlepiej przedstawi\u0107 r\u00f3\u017cnice pomi\u0119dzy obiektami typu stub, mock i spy, a tak\u017ce ich zastosowanie. Tego typu rozwi\u0105zania u\u0142atwiaj\u0105 twrzenie test\u00f3w jednostkowych, a jednocze\u015bnie zapobiegaj\u0105 niechcianym skutkom ubocznym,np. modyfikacji lub utracie danych w bazach.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>W tym artykule wyja\u015bniam r\u00f3\u017cnic\u0119 mi\u0119dzy obiektami z tytu\u0142u i pokazuj\u0119 do czego ka\u017cde z nich mo\u017ce pos\u0142u\u017cy\u0107.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,24],"tags":[27,32,29,28],"class_list":["post-647","post","type-post","status-publish","format-standard","hentry","category-artykuly","category-testy-jednostkowe","tag-junit","tag-mockito2","tag-stub","tag-testy-jednostkowe"],"_links":{"self":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/647","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=647"}],"version-history":[{"count":18,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/647\/revisions"}],"predecessor-version":[{"id":911,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=\/wp\/v2\/posts\/647\/revisions\/911"}],"wp:attachment":[{"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/klaudia-bernat.profesjonalnyprogramista.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}