{"id":20989,"date":"2015-08-06T16:12:56","date_gmt":"2015-08-06T15:12:56","guid":{"rendered":"https:\/\/www.inovex.de\/\/?p=752"},"modified":"2015-08-06T16:12:56","modified_gmt":"2015-08-06T15:12:56","slug":"unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/","title":{"rendered":"Unit Tests: Validieren mit Matchers, wenn Mocks nicht mehr reichen"},"content":{"rendered":"<p>Wenn Ausf\u00fchrungspfade f\u00fcr die Pr\u00fcfung mit Mocks zu komplex werden, kommt man mit einem Matcher viel weiter. In diesem Artikel erl\u00e4utern wir zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.<!--more--><\/p>\n<p>Unit Tests dienen dazu, die Korrektheit einer funktionalen Einheit zu \u00fcberpr\u00fcfen. Daf\u00fcr wird diese als Testsubjekt in eine Test-Fixture eingebettet, bei der man m\u00f6glichst alle Komponenten bis auf das Subjekt selbst unter Kontrolle hat. Die n\u00f6tigen Hilfsmittel daf\u00fcr bietet ein Test-Framework wie etwa JUnit.<\/p>\n<p>Die zu testende Funktion erh\u00e4lt und\/oder liefert ggf. Daten und ruft Methoden an Kollaboratoren auf. Die Korrektheit ergibt sich aus der Pr\u00fcfung dieser Daten und des Aufrufverhaltens.<\/p>\n<p>Zum \u00dcberpr\u00fcfen der Daten, die vom Subjekt produziert bzw. kommuniziert werden, kommt die Funktion <code>assert<\/code> in ihren vielen Auspr\u00e4gungen zum Einsatz. Besonders hervorzuheben ist dabei <code>assertThat(value, matcher)<\/code>, mit der ein Wert mit einer F\u00fclle von <code>Matcher<\/code>-Klassen aus der <code>Hamcrest<\/code>-Bibliothek validiert werden kann. Diese ist besonders darauf ausgelegt, eine L\u00f6sung f\u00fcr die komplexesten Datenstrukturen nach beliebig strikten oder flexiblen Kriterien zu bieten, indem man vorhandene <code>Matcher<\/code> kombiniert oder komfortabel eigene Implementierungen einsetzt.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#Testen-mit-Mocks\" >Testen mit Mocks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#Eine-Loesung-Das-Verhalten-des-Subjekts-als-Datenstruktur-modellieren\" >Eine L\u00f6sung: Das Verhalten des Subjekts als Datenstruktur modellieren<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#Kontakt\" >Kontakt<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Testen-mit-Mocks\"><\/span>Testen mit Mocks<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Das Verhalten des Subjekts definiert sich in erster Linie durch die Methodenaufrufe an seine Kollaboratoren und dar\u00fcber hinaus an den Daten, die es dabei \u00fcbergibt. Mocking Frameworks wie Mockito (oder EasyMock und andere) bieten die M\u00f6glichkeit, beim Test-Setup die Kollaboratoren eines ausreichend testbaren Subjekts durch <code>Mocks<\/code> (generierte Doubles) zu ersetzen. Nach dem Testaufruf wird mit der Funktion <code>verify<\/code> gepr\u00fcft, ob die tats\u00e4chlich erfolgten Methodenaufrufe an die <code>Mocks<\/code> (inklusive einer eventuellen Pr\u00fcfung der enthaltenen Daten) den Erwartungen entsprechen. Auch dies kann mehr oder weniger strikt geschehen. Dabei k\u00f6nnen Aspekte wie die Reihenfolge von Aufrufen (auch \u00fcber mehrere <code>Mocks<\/code> hinweg), die zul\u00e4ssige Anzahl einzelner Aufrufe und die Zul\u00e4ssigkeit von zus\u00e4tzlichen Aufrufen mit einbezogen werden.<\/p>\n<p>Es ist davon auszugehen, dass die Vielfalt von verschiedenen Strukturen und Mustern bei den Daten wesentlich h\u00f6her ist als beim Aufrufverhalten eines Subjekts an die Kollaboratoren. Entsprechend sind die <code>Matchers<\/code> so angelegt, dass man sich auf die meisten Situationen relativ leicht einstellen und mit etwas Mehraufwand eigentlich jede zu testende Datenstruktur verarbeiten kann.<\/p>\n<p>Die Optionen der <code>verify<\/code> Funktionen sind allerdings meist fest in den Mocking-Frameworks verdrahtet, liegen in internen Bereichen und lassen nur ein sehr geringes Ma\u00df an Erweiterung zu. Gerade was die Striktheit angeht, hat man h\u00e4ufig nur die Wahl zwischen ganz oder gar nicht.<\/p>\n<p><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/backen-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-768 alignright\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/backen-1-281x300.png\" alt=\"Ein ganz simpler Prozess.\" width=\"281\" height=\"300\" \/><\/a><\/p>\n<p>Nehmen wir zum Beispiel eine Funktion, die einen Prozess durchf\u00fchren soll, der aus mehreren Schritten besteht.<\/p>\n<p>Beim Zubereiten eines Pfannkuchens muss man<\/p>\n<p>Mehl zugeben, Milch zugeben, Eier zugeben<\/p>\n<p>dann Teig r\u00fchren<\/p>\n<p>dann Teig in der Pfanne backen.<\/p>\n<p>Die Reihenfolge der ersten drei Schritte untereinander ist f\u00fcr das korrekte Ergebnis unerheblich, die beiden letzten Schritte m\u00fcssen aber danach und in dieser Reihenfolge ausgef\u00fchrt werden. Wenn man nur pr\u00fcft, ob alle f\u00fcnf Schritte einmal ausgef\u00fchrt wurden, w\u00fcrde der Testcase nicht aufzeigen, falls in der Implementierung der unger\u00fchrte Teig gebacken w\u00fcrde. Dadurch wird der Test nutzlos.<\/p>\n<p>Wenn man die Implementierung der Funktion kennt und wei\u00df, dass Mehl vor Milch vor Eiern kommt, kann man diese eine Sequenz strikt mit <code>verify<\/code> pr\u00fcfen. Aber eine \u00c4nderung der Implementierung, die die Korrektheit des Ergebnisses nicht beeintr\u00e4chtigt, w\u00fcrde diesen Testcase fehlschlagen lassen. Und das sollte nicht passieren.<\/p>\n<p>Au\u00dferdem k\u00f6nnte es sein, dass mehrere K\u00f6che daran arbeiten und voneinander unabh\u00e4ngige Schritte parallel ausf\u00fchren (ForkJoinPool mit parallelen Subtasks). Dann w\u00fcrde der Testcase bei jedem Durchlauf potentiell mit einer anderen validen Ausf\u00fchrungsfolge konfrontiert, die er verl\u00e4sslich erkennen muss. Die verf\u00fcgbaren L\u00f6sungen f\u00fcr die Pr\u00fcfung der Reihenfolge von Aufrufen (<code>InOrder<\/code> bei Mockito, <code>StrictMockControl<\/code> bei Easymock) geben es aber leider nicht her, eine teilweise strikte und teilweise unabh\u00e4ngige Ausf\u00fchrungsstruktur zu definieren\u00a0\u2013 man muss also einen anderen Weg finden.<\/p>\n<p><a href=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/backen-2.png\"><img decoding=\"async\" class=\"wp-image-767 size-large alignright\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/backen-2-455x1024.png\" alt=\"Ein etwas komplexerer Prozess. \" width=\"281\" \/><\/a><\/p>\n<p>Die Menge aller g\u00fcltigen Ausf\u00fchrungspfade l\u00e4sst sich als ein unvollst\u00e4ndiger, gerichteter Graph darstellen, dessen Knoten die Arbeitsschritte und dessen Kanten die notwendigen Reihenfolgebeziehungen sind.<\/p>\n<p>Ein naiver Ansatz w\u00e4re es, alle im Graphen enthaltenen gerichteten Pfade als strikt geordnete Aufrufabfolge zu pr\u00fcfen. Das w\u00e4ren in diesem Falle also \u201eMehl vor r\u00fchren vor backen\u201c, \u201eMilch vor r\u00fchren vor backen\u201c und \u201eEier vor r\u00fchren vor backen\u201c wof\u00fcr drei <code>InOrder<\/code>-Kontexte ben\u00f6tig werden. Genauso gut kann man f\u00fcr jede Kante des Graphen die Reihenfolge von genau zwei Aufrufen mit einem <code>InOrder<\/code>-Kontext abhandeln und w\u00fcrde damit die Beziehung zwischen \u201er\u00fchren\u201c und \u201ebacken\u201c nicht mehrmals pr\u00fcfen.<\/p>\n<p>Aber schon eine kleine Erweiterung des Prozesses f\u00fchrt zu einer unverh\u00e4ltnism\u00e4\u00dfig schnell wachsenden Menge an Knoten und Kanten. Dabei m\u00fcsste die Abrufabfolge f\u00fcr jeden einzelnen Prozess komplett manuell ausgearbeitet werden.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Eine-Loesung-Das-Verhalten-des-Subjekts-als-Datenstruktur-modellieren\"><\/span>Eine L\u00f6sung: Das Verhalten des Subjekts als Datenstruktur modellieren<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Die Darstellung aller validen Abl\u00e4ufe ist eine Menge von Reihenfolgebeziehungen (\u201eA vor B\u201c) von einzelnen Aktionen (<code>Set&lt;Order&lt;Step&gt;&gt;<\/code>). Dies kann wie oben erw\u00e4hnt leicht als gerichteter Graph modelliert werden, aus dem wiederum diese Menge berechnet werden kann. Mit dem Builder-Pattern l\u00e4sst sich eine solche Struktur recht komfortabel und \u00fcbersichtlich aufbauen.<\/p>\n<p>Abschlie\u00dfend muss man noch die Kollaboratoren anstatt durch <code>Mocks<\/code> durch ein anderes Double ersetzen, das bei einem Methodenaufruf einer zentralen Liste von tats\u00e4chlich erfolgten Aktionen einen Eintrag hinzuf\u00fcgt. Am Ende erh\u00e4lt man hieraus eine <code>List&lt;Step&gt;<\/code>.<\/p>\n<p>Die Validierung reduziert sich auf die Pr\u00fcfung, ob die Liste von Aktionen allen Bedingungen der geforderten Reihenfolgen erf\u00fcllt. Daf\u00fcr l\u00e4sst sich leicht ein <code>Matcher<\/code> implementieren, der mit einem <code>Set&lt;Order&lt;Step&gt;&gt;<\/code> initialisiert wird, um ihn dann mit <code>assertThat<\/code> auf die <code>List&lt;Step&gt;<\/code> anzuwenden.<\/p>\n<p>Ist dies einmal implementiert, muss f\u00fcr jeden Prozess im Test nur der Ablaufgraph bef\u00fcllt werden und der Rest funktioniert von selbst.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Kontakt\"><\/span>Kontakt<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Testing geh\u00f6rt zum Alltag in vielen unserer Leistungsbereiche. Auf <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/\" target=\"_blank\" rel=\"noopener\">unserer Website<\/a> gibt es mehr Informationen dazu, der direkte Kontakt zu uns ist telefonisch unter <a href=\"tel:+497216190210\">+49 721 619 021-0<\/a> oder jederzeit per <a href=\"mailto:list-blog@inovex.de\" target=\"_blank\" rel=\"noopener\">E-Mail an list-blog@inovex.de<\/a> m\u00f6glich.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Ausf\u00fchrungspfade f\u00fcr die Pr\u00fcfung mit Mocks zu komplex werden, kommt man mit einem Matcher viel weiter. In diesem Artikel erl\u00e4utern wir zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.<\/p>\n","protected":false},"author":25,"featured_media":12188,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[68,69],"service":[],"coauthors":[{"id":25,"display_name":"Sebastian Schmidt","user_nicename":"sschmidt"}],"class_list":["post-20989","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-backend","tag-digital-quality"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Validieren mit Matchers, wenn Mocks nicht mehr reichen<\/title>\n<meta name=\"description\" content=\"Wir erl\u00e4utern zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Validieren mit Matchers, wenn Mocks nicht mehr reichen\" \/>\n<meta property=\"og:description\" content=\"Wir erl\u00e4utern zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2015-08-06T15:12:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2300\" \/>\n\t<meta property=\"og:image:height\" content=\"678\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sebastian Schmidt\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen-1024x302.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sebastian Schmidt\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Sebastian Schmidt\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/\"},\"author\":{\"name\":\"Sebastian Schmidt\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a2ffffeaeaa18b9961297ca47e5f3799\"},\"headline\":\"Unit Tests: Validieren mit Matchers, wenn Mocks nicht mehr reichen\",\"datePublished\":\"2015-08-06T15:12:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/\"},\"wordCount\":1012,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/08\\\/unittest-screen.jpg\",\"keywords\":[\"Backend\",\"Digital Quality\"],\"articleSection\":[\"Applications\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/\",\"name\":\"Validieren mit Matchers, wenn Mocks nicht mehr reichen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/08\\\/unittest-screen.jpg\",\"datePublished\":\"2015-08-06T15:12:56+00:00\",\"description\":\"Wir erl\u00e4utern zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/08\\\/unittest-screen.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2015\\\/08\\\/unittest-screen.jpg\",\"width\":2300,\"height\":678,\"caption\":\"Unittest Screen\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unit Tests: Validieren mit Matchers, wenn Mocks nicht mehr reichen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a2ffffeaeaa18b9961297ca47e5f3799\",\"name\":\"Sebastian Schmidt\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg5f905a8b3627c2eb15cdb285c29fe6cf\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg\",\"caption\":\"Sebastian Schmidt\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/sschmidt\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Validieren mit Matchers, wenn Mocks nicht mehr reichen","description":"Wir erl\u00e4utern zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/","og_locale":"de_DE","og_type":"article","og_title":"Validieren mit Matchers, wenn Mocks nicht mehr reichen","og_description":"Wir erl\u00e4utern zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.","og_url":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2015-08-06T15:12:56+00:00","og_image":[{"width":2300,"height":678,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen.jpg","type":"image\/jpeg"}],"author":"Sebastian Schmidt","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen-1024x302.jpg","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Sebastian Schmidt","Gesch\u00e4tzte Lesezeit":"5\u00a0Minuten","Written by":"Sebastian Schmidt"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/"},"author":{"name":"Sebastian Schmidt","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a2ffffeaeaa18b9961297ca47e5f3799"},"headline":"Unit Tests: Validieren mit Matchers, wenn Mocks nicht mehr reichen","datePublished":"2015-08-06T15:12:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/"},"wordCount":1012,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen.jpg","keywords":["Backend","Digital Quality"],"articleSection":["Applications","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/","url":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/","name":"Validieren mit Matchers, wenn Mocks nicht mehr reichen","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen.jpg","datePublished":"2015-08-06T15:12:56+00:00","description":"Wir erl\u00e4utern zun\u00e4chst die Grundlagen von Unit Tests, um dann auf die Probleme mit Mocks einzugehen und Matchers als Alternative vorzustellen.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2015\/08\/unittest-screen.jpg","width":2300,"height":678,"caption":"Unittest Screen"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/unit-tests-validieren-mit-matchers-wenn-mocks-nicht-mehr-reichen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Unit Tests: Validieren mit Matchers, wenn Mocks nicht mehr reichen"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a2ffffeaeaa18b9961297ca47e5f3799","name":"Sebastian Schmidt","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg5f905a8b3627c2eb15cdb285c29fe6cf","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg","caption":"Sebastian Schmidt"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/sschmidt\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/20989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=20989"}],"version-history":[{"count":0,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/20989\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/12188"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=20989"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=20989"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=20989"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=20989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}