{"id":4470,"date":"2019-12-24T14:42:12","date_gmt":"2019-12-24T12:42:12","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4470"},"modified":"2019-12-24T14:42:12","modified_gmt":"2019-12-24T12:42:12","slug":"dummy-fake-stub-und-mock","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2019\/12\/dummy-fake-stub-und-mock\/","title":{"rendered":"Dummy, Fake, Stub und Mock"},"content":{"rendered":"<p>Gute objektorientiert entworfene Systeme zeichnen sich dadurch aus, dass es eine hohe Interaktion mit anderen Objekten gibt. Idealerweise zerlegt eine Klasse ein Problem nur bis zu dem Punkt, an dem es sich einer anderen Klasse bedienen kann, die dieses einfachere Problem l\u00f6st. Schwierig wird es, wenn eine eigene Klasse auf eine andere komplexe Klasse zur\u00fcckgreift und das Objekt nur dann sinnvoll arbeitet, wenn das referenzierte Objekt da ist und irgendwie sinnvoll antwortet. Diese Abh\u00e4ngigkeit ist ung\u00fcnstig, denn das Ziel eines guten Tests besteht ja darin, lokal zu sein, also die eigentliche Klasse zu testen und nicht alle referenzierten Klassen um sie herum gleich mit.<\/p>\n<p>In der Praxis begegnen uns drei Hilfskonstrukte, die die Lokalit\u00e4t von Tests erm\u00f6glichen:<\/p>\n<ul>\n<li>Fake-Objekte: Sie sind eine g\u00fcltige Implementierung einer Schnittstelle. Wenn zum Beispiel ein Repository auf die Datenbank geht, kann ein Fake-Implementierung Datens\u00e4tze in einer Datenstruktur speichern. Das Verhalten ist nachgebildet und vereinfacht, aber funktionsf\u00e4hig. So liefert ein Fake-Repository statt Kunden aus der Datenbank immer die gleichen N vorgefertigten Kunden. Fake-Objekte sind auch praktisch, wenn zum Beispiel eine GUI-Anwendung programmiert wird, die statt echter Datenbankdaten erst einmal mit den Fake-Objekten entwickelt wird und so die Demodaten anzeigt. Wenn ein Team die GUI baut und ein anderes Team den Service, so k\u00f6nnen beide Gruppen unabh\u00e4ngig arbeiten, und das GUI-Team muss nicht erst auf die Implementierung warten.<\/li>\n<li>Stub-Objekte: Stub-Objekte implementieren ein bestimmtes Protokoll, sodass sie f\u00fcr den Testfall immer die gleichen Antworten geben k\u00f6nnen. Wenn etwa ein E-Mail-Service eine Methode isTransmitted() anbietet, so kann der Stub immer true liefern. Stubs haben also kein Verhalten, sondern der Rumpf der Methoden ist quasi leer und minimal. Sie gibt es nur f\u00fcr die Testf\u00e4lle.<\/li>\n<li>Mock-Objekte: Mock-Objekte werden von einem Testfall \u00bbaufgeladen\u00ab und zeigen dann das gew\u00fcnschte Verhalten \u2013 sie liefern also nicht wie Stubs immer das gleiche Ergebnis. In der Regel werden Mock-Objekte durch Bibliotheken wie mockito(http:\/\/mockito.org) oder EasyMock\u00a0(http:\/\/easymock.org) automatisch zur Laufzeit erzeugt.<\/li>\n<\/ul>\n<p>Diese drei Typen k\u00f6nnen wir unter dem Oberbegriff Dummy-Objekt\u00a0zusammenfassen. Grunds\u00e4tzlich gilt bei den vier Begriffen aber, dass sie von Autoren nicht einheitlich verwendet werden.<a href=\"#_ftn1\" name=\"_ftnref1\">[1]<\/a><\/p>\n<p>Beispiel: Mockito-Beispiel<\/p>\n<p>Nehmen wir an, alles aus org.mockito.Mockito.* ist statisch importiert und wir wollen eine java.util.List aufbauen. Dazu muss Mockito erst etwas aufbauen, was sich wie List verh\u00e4lt:<\/p>\n<p>List&lt;?&gt; mockedList = mock( List.class );<\/p>\n<p>Im n\u00e4chsten Schritt muss das Verhalten der speziellen Liste bestimmt werden:<\/p>\n<p>when( mockedList.get(0) ).thenReturn( &#8222;tutego&#8220; );<\/p>\n<p>Anschlie\u00dfend ist die Liste bereit zur Nutzung:<\/p>\n<p>System.out.println( mockedList.get(0) ); \/\/ tutego<\/p>\n<p><a href=\"#_ftnref1\" name=\"_ftn1\">[1]<\/a> Die Seite http:\/\/xunitpatterns.com\/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html stellt einige Autoren mit ihrer Begriffsnutzung vor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gute objektorientiert entworfene Systeme zeichnen sich dadurch aus, dass es eine hohe Interaktion mit anderen Objekten gibt. Idealerweise zerlegt eine Klasse ein Problem nur bis zu dem Punkt, an dem es sich einer anderen Klasse bedienen kann, die dieses einfachere Problem l\u00f6st. Schwierig wird es, wenn eine eigene Klasse auf eine andere komplexe Klasse zur\u00fcckgreift [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-4470","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4470"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4470\/revisions"}],"predecessor-version":[{"id":4471,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4470\/revisions\/4471"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}