<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Mockito%3A_Einf%C3%BChrung</id>
	<title>Mockito: Einführung - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Mockito%3A_Einf%C3%BChrung"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;action=history"/>
	<updated>2026-05-06T17:40:25Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=176&amp;oldid=prev</id>
		<title>Ullrich: Ullrich verschob die Seite Mockito Einführung nach Mockito: Einführung, ohne dabei eine Weiterleitung anzulegen</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=176&amp;oldid=prev"/>
		<updated>2024-01-11T08:13:26Z</updated>

		<summary type="html">&lt;p&gt;Ullrich verschob die Seite &lt;a href=&quot;/index.php?title=Mockito_Einf%C3%BChrung&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Mockito Einführung (Seite nicht vorhanden)&quot;&gt;Mockito Einführung&lt;/a&gt; nach &lt;a href=&quot;/index.php?title=Mockito:_Einf%C3%BChrung&quot; title=&quot;Mockito: Einführung&quot;&gt;Mockito: Einführung&lt;/a&gt;, ohne dabei eine Weiterleitung anzulegen&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 11. Januar 2024, 08:13 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;de&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(kein Unterschied)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=52&amp;oldid=prev</id>
		<title>Ullrich am 23. Juni 2021 um 17:19 Uhr</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=52&amp;oldid=prev"/>
		<updated>2021-06-23T17:19:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 23. Juni 2021, 17:19 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l334&quot;&gt;Zeile 334:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 334:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}).when(mock).save(Mockito.any(Customer .class));&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}).when(mock).save(Mockito.any(Customer .class));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== Methoden die Class-Objekte liefern ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dieses Problem wird [[Mockito: Methoden die Class-Objekte liefern|hier]] beschrieben&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Methoden mit Variablen Argument-Listen ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Methoden mit Variablen Argument-Listen ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Weichen wir mal der Diskussion aus, ob Var-Arg-Methoden schön, sinnvoll oder wünschenswert sind und welche&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Weichen wir mal der Diskussion aus, ob Var-Arg-Methoden schön, sinnvoll oder wünschenswert sind und welche&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=36&amp;oldid=prev</id>
		<title>Ullrich: /* Einführung */</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=36&amp;oldid=prev"/>
		<updated>2021-04-21T19:28:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Einführung&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 21. April 2021, 19:28 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Zeile 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Mockito]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Mockito]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Einführung =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Einführung =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ein Mock – im Sinne dieser &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Eiführung &lt;/del&gt; – ist ein Objekt, das so aussieht aber sich nicht so verhält wie das &amp;quot;echte&amp;quot; Objekt das es ersetzt.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Ein Mock – im Sinne dieser &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Einführung &lt;/ins&gt; – ist ein Objekt, das so aussieht aber sich nicht so verhält wie das &amp;quot;echte&amp;quot; Objekt das es ersetzt.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Man kann sich das vorstellen wie eine Theater-Requisite: Benötigt man auf der Bühne ein Buch, verwendet man einen Pappkarton,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Man kann sich das vorstellen wie eine Theater-Requisite: Benötigt man auf der Bühne ein Buch, verwendet man einen Pappkarton,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;der von außen aussieht wie ein Buch aber keines ist. So versteht diese Einführung unter einem &amp;quot;Mock&amp;quot; -- salopp ausgedrückt:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;der von außen aussieht wie ein Buch aber keines ist. So versteht diese Einführung unter einem &amp;quot;Mock&amp;quot; -- salopp ausgedrückt:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=32&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Category:Java Category:Mockito = Einführung = Ein Mock – im Sinne dieser Eiführung  – ist ein Objekt, das so aussieht aber sich nicht so verhält…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Mockito:_Einf%C3%BChrung&amp;diff=32&amp;oldid=prev"/>
		<updated>2021-04-21T19:23:50Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&lt;a href=&quot;/index.php?title=Kategorie:Java&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kategorie:Java (Seite nicht vorhanden)&quot;&gt;Category:Java&lt;/a&gt; &lt;a href=&quot;/index.php?title=Kategorie:Mockito&quot; title=&quot;Kategorie:Mockito&quot;&gt;Category:Mockito&lt;/a&gt; = Einführung = Ein Mock – im Sinne dieser Eiführung  – ist ein Objekt, das so aussieht aber sich nicht so verhält…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Java]]&lt;br /&gt;
[[Category:Mockito]]&lt;br /&gt;
= Einführung =&lt;br /&gt;
Ein Mock – im Sinne dieser Eiführung  – ist ein Objekt, das so aussieht aber sich nicht so verhält wie das &amp;quot;echte&amp;quot; Objekt das es ersetzt.&lt;br /&gt;
Man kann sich das vorstellen wie eine Theater-Requisite: Benötigt man auf der Bühne ein Buch, verwendet man einen Pappkarton,&lt;br /&gt;
der von außen aussieht wie ein Buch aber keines ist. So versteht diese Einführung unter einem &amp;quot;Mock&amp;quot; -- salopp ausgedrückt:&lt;br /&gt;
{{Quotation|&lt;br /&gt;
ein Objekt, das ein anderes ersetzt und dabei das originale Objekt in bestimmten Aspekten nachahmen kann,&lt;br /&gt;
&lt;br /&gt;
aber niemals dessen vollständige Funtionalität hat.&lt;br /&gt;
Es kann Funktionalität und Seiteneffekte hinzufügen falls erforderlich.}}&lt;br /&gt;
&lt;br /&gt;
Tatsächlich ist die Verwendung der Begriffe Dummy, Fake, Stub und Mock durchaus uneinheitlich.&lt;br /&gt;
Für diese Einführung verzichten wir auf eine akademische Unterscheidung, gehen pragmatisch vor,&lt;br /&gt;
sprechen durchgehend vom &amp;quot;Mock&amp;quot; und meinen das oben genannte.&lt;br /&gt;
Dem Sprachenthusiasten, der an einer genaueren Definition interessiert ist,&lt;br /&gt;
sei zum Einstieg der Blog-Artikel von&lt;br /&gt;
[https://martinfowler.com/articles/mocksArentStubs.html Martin Fowler] empfohlen.&lt;br /&gt;
&lt;br /&gt;
== Aufgaben ==&lt;br /&gt;
Ein Mock kann bei der Implementierung von Unit-Tests für verschiedene Aufgaben genutzt werden.&lt;br /&gt;
Man kann diese Aufgaben in der Regel auch anders lösen, aber wir möchten hier natürlich erörtern &lt;br /&gt;
wie &amp;#039;&amp;#039;Mockito&amp;#039;&amp;#039; uns bei der Erfüllung unterstützen kann.&lt;br /&gt;
&lt;br /&gt;
Typische Aufgaben für Mocks sind&lt;br /&gt;
*Das Emulieren von Klassen, deren wahre Funktionalität nicht ausgeführt werden kann, darf oder soll&lt;br /&gt;
*Das Erzeugen von Instanzen von Interfaces und Klassen, von denen keine konkrete Implementierung erzeugt werden kann&lt;br /&gt;
*Der Überprüfung, ob –- und mit welchen Argumenten -– Methoden einer Klasse aufgerufen wurden.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;So tun als täte es:&amp;#039;&amp;#039;&amp;#039; Jeder Unit-Test muß isoliert und ohne externe Abhängigkeiten ausgeführt werden können. Es&lt;br /&gt;
reicht nicht, wenn der Test lokal im Eclipse läuft, er muß auch jederzeit vom Jenkins-Build ausgeführt werden&lt;br /&gt;
können. Greift beispielsweise eine Methode auf einen Web-Service oder eine lokale Datenbank zu, kann der Test&lt;br /&gt;
nicht ausgeführt werden. Man kann dann Mock-Implementierungen der Service-Klasse bzw. der Persistenz-Schicht&lt;br /&gt;
erzeugen und mit diesen als Ersatz den Unit-Test durchführen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;So tun als gäbe es:&amp;#039;&amp;#039;&amp;#039; Der Typ eines Parameters der zu testenden Methode sei ein Interface. Dann benötigt man&lt;br /&gt;
für den Aufruf der Methode im Rahmen des Unit-Tests eine Objekt-Instanz einer Klasse die das Interface implementiert.&lt;br /&gt;
Statt das Interface selbst zu implementieren, überläßt man Mockito die Fußarbeit und nutzt einen Mock.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Prüfen, ob:&amp;#039;&amp;#039;&amp;#039; In vielen Unit-Tests möchte man sicherstellen, daß beim Durchlauf eine bestimmte Methode&lt;br /&gt;
aufgerufen wird (oder garantiert nicht aufgerufen wird) oder daß eine Methode mit bestimmten Argumenten aufgerufen wird.&lt;br /&gt;
Das läßt sich bei allen Mockito-Mocks serienmäßig überprüfen, Mockito erlaubt es aber auch, &amp;quot;echte&amp;quot; Objekte&lt;br /&gt;
mit einem Spy-Objekt zu umwickeln über das die entsprechende Information abgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Abgrenzung ==&lt;br /&gt;
Anstelle von Mockito-Mocks kann man auch einfach &lt;br /&gt;
Interfaces implementieren und Klassen ableiten um zu Mock-Implementierungen zu kommen. Java-Interfaces&lt;br /&gt;
wurden ja auch zu dem Zweck geschaffen, unterschiedlicher Implementierungen mit der gleichen Schnittstelle zu&lt;br /&gt;
schaffen – warum also Mockito nutzen? Die Erzeugung eines Mockito-Mocks nimmt eine Zeile Code in Anspruch;&lt;br /&gt;
gleichgültig wieviele Methoden implementiert oder überschrieben werden. Eine konkrete Klasse braucht eine&lt;br /&gt;
explizite Implementierung und das wird schnell unübersichtlich. Zudem aktualisiert sich der Mock automatisch,&lt;br /&gt;
weil er erst zur Laufzeit entsteht. Eine händische Implementierung eines Interface muß jedesmal angefaßt werden,&lt;br /&gt;
wenn sich das Interface ändert – ein Mockito-Mock nicht.&lt;br /&gt;
&lt;br /&gt;
Zum Schluß der Einleitung sei darauf hingewiesen, was Mockito nicht mocken kann:&lt;br /&gt;
*statische Methoden&lt;br /&gt;
*private Methoden&lt;br /&gt;
*finale Klassen und Methoden&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite geht es um die Erstellung von Mocks. Spies und alternative Vorgehen werden [[Partieller Mock|hier]]&lt;br /&gt;
behandelt, um das Überprüfen des Aufrufverhaltens [[Mockito Verify|hier]].&lt;br /&gt;
&lt;br /&gt;
= Mocking =&lt;br /&gt;
Mocking hat zwei Schritte. Zunächst wird ein Mock-Objekt von der gewünschten Klasse erzeugt,&lt;br /&gt;
dann werden Methoden des Objekts in der Weise implementiert wie es für den Test erforderlich ist.&lt;br /&gt;
&lt;br /&gt;
Der zweite Schritt ist optional, ein vollständig funktionsloser Mock ist in vielen Fällen schon&lt;br /&gt;
ausreichend. In aller Regel wird man dem Mock jedoch Funktionalität hinzufügen wollen.&lt;br /&gt;
Diese Einführung folgt diesem Vorgehen und beschreibt die nötigen Werkzeuge. Alternative&lt;br /&gt;
Ansätze werden hier [[Partieller_Mock|besprochen]].&lt;br /&gt;
&lt;br /&gt;
== Das Mock-Objekt ==&lt;br /&gt;
&lt;br /&gt;
Der einfachste Mock für ein Objekte einer Klasse oder eines Interfaces erlaubt den Aufruf jeder nicht-statischen,&lt;br /&gt;
non-private, non-final Methode ohne daß dabei eine Exception auftritt.&lt;br /&gt;
Er wird so erzeugt:&lt;br /&gt;
{{java|code=Foo mock = Mockito.mock(Foo.class);}}&lt;br /&gt;
Die Methoden des Mocks tun nichts, sie rufen auch keine super-Methoden auf. Es wird nur sichergestellt daß jede Methode&lt;br /&gt;
gefahrlos aufgerufen werden kann und ggf. einen gültigen, wenn auch bedeutungslosen Wert liefert. Anstelle von Objekten&lt;br /&gt;
(dazu gehören auch Strings) erhält man stets {{java|null}}, numerische Ergebnisse sind immer &amp;#039;&amp;#039;0&amp;#039;&amp;#039;&lt;br /&gt;
und boolean-Methoden liefern immer {{java|false}}.&lt;br /&gt;
&lt;br /&gt;
Wird eine Klasse gemockt, erzeugt Mockito eine Ableitung der zu mockenden Klasse. In der Folge können weder finale&lt;br /&gt;
Klassen noch finale Methoden gemockt werden. Gleiches gilt für statische Methoden, die nicht vererbt werden.&lt;br /&gt;
&lt;br /&gt;
Der Mock kann auf Felder der gemockten Klasse zugreifen, solange diese nicht private sind. Allerdings kann&lt;br /&gt;
er keine eigenen Felder definieren. Auf public und package visible Felder kann auch von außen zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
== Mocken von Methoden ==&lt;br /&gt;
&lt;br /&gt;
Wie erwähnt, liefern Methoden gemockter Klassen nur default-Werte; das ist selten ausreichend.&lt;br /&gt;
Betrachten wir zunächst die einfachste Variante:&lt;br /&gt;
bei jedem Aufruf der Methode solleb die gleichen, feste Werte geliefert werden.&lt;br /&gt;
Wir mocken dafür das folgende Interface:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public interface Person {&lt;br /&gt;
    String id();&lt;br /&gt;
    String abteilung();&lt;br /&gt;
    int foo(String dings);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
=== Parameterlose Methoden ===&lt;br /&gt;
Soll etwa die ID der Person immer den Wert 5 liefern, könnte das so aussehen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
person = Mockito.mock(Person.class);&lt;br /&gt;
Mockito.when(person.id()).thenReturn(5);&lt;br /&gt;
}}&lt;br /&gt;
Das Argument der {{java|when}}-Methode ist ein Methoden-Aufruf auf den Mock,&lt;br /&gt;
das Argument der {{java|thenReturn}}-Methode ist der zu liefernde Wert.&lt;br /&gt;
Soll die Methode eine Abfolge fester Werte liefern, kann man eine Liste angeben:&lt;br /&gt;
{{java|code=Mockito.when(person.abteilung()).thenReturn(&amp;quot;BLA&amp;quot;, &amp;quot;FOO&amp;quot;);}}&lt;br /&gt;
Beim ersten Aufruf liefert die Methode den String {{java|BLA}} und beim zweiten {{java|FOO}}.&lt;br /&gt;
Man kann die Werte auch einzeln angeben:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.when(person.abteilung())&lt;br /&gt;
    .thenReturn(&amp;quot;BLA&amp;quot;)&lt;br /&gt;
    .thenReturn(&amp;quot;FOO&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
Verwendet man die zweite Variante, kann man die gemockte Methode auch dazu bringen, zwischendurch Exceptions zu werfen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.when(person.abteilung())&lt;br /&gt;
    .thenReturn(&amp;quot;BLA&amp;quot;)&lt;br /&gt;
    .thenThrow(new RuntimeException());&lt;br /&gt;
    .thenReturn(&amp;quot;FOO&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
Sind alle Werte durch Aufruf verbraucht, liefert die Methode wieder den default-Wert.&lt;br /&gt;
&lt;br /&gt;
=== Methoden mit Parametern ===&lt;br /&gt;
Die meisten Methoden haben einen oder mehrere Parameter. Will man solche Methoden mocken, muß man&lt;br /&gt;
spezifizieren bei welchen Argumenten welche Ergebnisse geliefert werden sollen. Im einfachsten Falle gibt man den&lt;br /&gt;
Argument-Wert als Literal vor:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Foo p = Mockito.mock(Person.class);&lt;br /&gt;
Mockito.when(p.foo(&amp;quot;x&amp;quot;)).thenReturn(10);&lt;br /&gt;
Assertions.assertThat(p.foo(&amp;quot;x&amp;quot;)).isEqualTo(10);&lt;br /&gt;
}}&lt;br /&gt;
Die Methode {{java|foo}} liefert für {{java|foo(&amp;quot;X&amp;quot;)}} nun den Wert &amp;#039;&amp;#039;10&amp;#039;&amp;#039; und für alle anderen Argumente einen undefinierten Wert.&lt;br /&gt;
Wie erwähnt wird die Methode für alle anderen Argumente den Wert &amp;#039;&amp;#039;0&amp;#039;&amp;#039; liefern, aber man sollte sich nicht darauf verlassen,&lt;br /&gt;
daß das auch immer und unter allen Umständen so sein wird.&lt;br /&gt;
&lt;br /&gt;
In den meisten Fällen wird man nicht auf einzelne Werte reagieren wollen, sondern auf Gruppen von Werten oder&lt;br /&gt;
auf alle möglichen Werte. Um das zu bewerkstelligen werden Matcher benötigt, die beim Aufruf versuchen die Argumente zu matchen.&lt;br /&gt;
Die Mockito-Matcher werden über statische Methoden der Klasse {{java|ArgumentMatchers}} bereitgestellt.&lt;br /&gt;
&lt;br /&gt;
Da unsere Einstiegsklasse {{java|Mockito}} davon ableitet, &amp;quot;erbt&amp;quot; sie alle dort beheimateten statischen Methodem. Der Kürze halber&lt;br /&gt;
wird man sie also –- wie hier dargestellt –- über die Mockito-Klasse referenzieren. Das ist nach der reinen Java-Lehre eigentlich&lt;br /&gt;
nicht sauber, da statische Methoden nicht vererbbar sind. Aber da hier keine Probleme zu erwaretn sind, darf der Test-Code sich das erlauben. &lt;br /&gt;
&lt;br /&gt;
Im Folgenden werden einige häufig benutzte Matcher vorgestellt.&lt;br /&gt;
&lt;br /&gt;
==== Immer das Gleiche ====&lt;br /&gt;
Um für &amp;#039;&amp;#039;jedes&amp;#039;&amp;#039; beliebige Argument den gleichen Wert zuliefern, verwendet man einen der vielen {{java|any}}-Matcher.&lt;br /&gt;
{{java|Mockito.anyString()}} etwa akzeptiert jeden String mit Ausnahme von {{java|null}} -- dazu später:&lt;br /&gt;
{{java|code=Mockito.when(p.foo(Mockito.anyString())).thenReturn(12);}}&lt;br /&gt;
Die Methode {{java|foo}} liefert nun für jedes beliebige String-Argument – ganz verläßlich – den Wert &amp;#039;&amp;#039;12&amp;#039;&amp;#039;.&lt;br /&gt;
Analog zu String bietet Mockito für eine Vielzahl von Typen – darunter auch für alle simplen Typen&lt;br /&gt;
wie {{java|int}} oder {{java|boolean}} – Matcher an, die jeweils mit &amp;quot;any&amp;quot; beginnen.&lt;br /&gt;
Kann der Compiler den Typ selbst erkennen, geht auch das generische {{java|any()}}:&lt;br /&gt;
{{java|code=Mockito.when(p.foo(Mockito.any())).thenReturn(10);}}&lt;br /&gt;
Handelt es sich um eine Klasse, kann man den Typ auch explizit angeben:&lt;br /&gt;
{{java|code=Mockito.when(p.foo(Mockito.any(String.class))).thenReturn(10);}}&lt;br /&gt;
Soll neben echten Objekten auch {{java|null}} als Argument akzeptiert werden, verwendet man {{java|nullable}};&lt;br /&gt;
das geht nur unter Angabe einer Klasse:&lt;br /&gt;
{{java|code=Mockito.when(p.foo(Mockito.nullabe(String.class))).thenReturn(10);}}&lt;br /&gt;
Möchte man &amp;#039;&amp;#039;nur&amp;#039;&amp;#039; auf {{java|null}} reagieren geht das auch, diesmal ohne Klasse:&lt;br /&gt;
{{java|code=Mockito.when(p.foo(Mockito.isNull())).thenReturn(10);}}&lt;br /&gt;
&lt;br /&gt;
==== Manchmal das Gleiche ====&lt;br /&gt;
Das Konstrukt {{java|Mockito.anyString()}} liefert einen Matcher. Das ist ein Objekt, das beim Aufruf den Eingabe-Wert&lt;br /&gt;
analysiert und Übereinstimmungen signalisiert. Erkennt der Matcher im {{java|when()}}-Teil das definierte Muster,&lt;br /&gt;
wird der Wert des {{java|thenReturn()}} als Ergebnis geliefert.&lt;br /&gt;
&lt;br /&gt;
Neben den any-Matchern giebt es eine Fülle anderer Matcher die auf verschiedene Auswahlen von Argumenten passen.&lt;br /&gt;
Zum Gebrauch sei auf die API-Doku von {{java|ArgumentMatchers}} verwiesen.&lt;br /&gt;
&lt;br /&gt;
Die meisten Fälle lassen sich aber mit dem Universal-Matcher {{java|argThat}} behandeln. Er verlangt als Argument&lt;br /&gt;
eine Implementierung des (funktionalen) Interfaces {{java|ArgumentMatcher &amp;lt;T&amp;gt;}} (&amp;#039;&amp;#039;&amp;#039;ohne -s!&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
Das Interface ist äquivalent zum JDK-Interface {{java|Predicate}}, es hat einen Objekt-Parameter und liefert&lt;br /&gt;
{{java|true}} für &amp;quot;Match&amp;quot; oder {{java|false}} oder &amp;quot;kein Match&amp;quot;.&lt;br /&gt;
Dadurch läßt sich jeder passende {{lambda}}-Ausdruck als Matcher verwenden. &lt;br /&gt;
In voller {{lambda}}-Geschwätzigkeit sieht das zum Beispiel so aus:&lt;br /&gt;
{{java|code=Mockito.when(p.foo(ArgumentMatchers.argThat((String s) -&amp;gt; s.length() &amp;gt; 5))).thenReturn(10);}}&lt;br /&gt;
Wenn das das alles nicht reicht, findet man in der hamcrest-Bibliothek eine unglaubliche Fülle weiterer Matcher.&lt;br /&gt;
&lt;br /&gt;
==== Mal dies -- mal das ====&lt;br /&gt;
Man kann beliebig viele {{java|.when}}-Konstrukte verwenden um den Mock für unterschiedlichen Argumente&lt;br /&gt;
unterschiedliche Ergebnisse liefern zu lassen. Mockito wendet die Matcher bei der späteren Ausführung in der&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;umgekehrten&amp;#039;&amp;#039;&amp;#039; Reihenfolge ihrer Definition an. In der folgenden Kombination&lt;br /&gt;
{{java|code=&lt;br /&gt;
Foo p = Mockito.mock(Foo.class);&lt;br /&gt;
Mockito.when(p.foo(Mockito.anyString())).thenReturn(12);&lt;br /&gt;
Mockito.when(p.foo(&amp;quot;x&amp;quot;)).thenReturn(10);&lt;br /&gt;
}}&lt;br /&gt;
liefert {{java|foo(&amp;quot;x&amp;quot;)}} daher den Wert &amp;#039;&amp;#039;10&amp;#039;&amp;#039; und für jedes andere Argument liefert {{java|foo}} den Wert &amp;#039;&amp;#039;12&amp;#039;&amp;#039;.&lt;br /&gt;
Selbstverständlich lassen sich in jedem Ausdruck beliebige Matcher verwenden.&lt;br /&gt;
Man muß bei der Definition aber darauf achten, daß die allgemeineren Matcher zuerst kommen.&lt;br /&gt;
Fügt man dem letzten Beispiel etwa noch ein {{java|.when}} mit einem {{java|anyString()}} an:&lt;br /&gt;
{{java|code=Mockito.when(Mockito.anyString()).thenReturn(4711);}}&lt;br /&gt;
dann werden alle vorher definierten Regeln ignoriert weil die letzte und allgemeinste Regel zuerst zieht.&lt;br /&gt;
&lt;br /&gt;
=== Methoden responsive mocken ===&lt;br /&gt;
Die oben vorgestellten Verfahren liefern bei jedem Methoden-Aufruf feste Werte die bei der Mock-Definition festgelegt werden.&lt;br /&gt;
Oft ist es aber erforderlich, daß bei Aufruf der gemockten Methode Werte zurückgeliefert die aus den Argumenten errechnet werden.&lt;br /&gt;
Oder es ist erforderlich, daß die gemockte Methode irgendwelche Aktivitäten ausführt.&lt;br /&gt;
&lt;br /&gt;
Mit den genannten Verfahren ist das nicht möglich, man benötigt eine &amp;quot;Answer&amp;quot;. Dazu stehen zwei Varianten&lt;br /&gt;
zur Verfügung die sich in der Reihenfolge der Definition unterscheiden. Welche Variante man bevorzugt ist in vielen&lt;br /&gt;
Fällen unerheblich, when ... thenAnswer ist vielleicht etwas &amp;quot;intuitiver&amp;quot;. Keine Wahl hat man, wenn man eine &lt;br /&gt;
void-Methode mocken möchte. Auch beim Mocken einzelner Methoden eines [[Partieller_Mock|Spys]] muß man die zweite Variante verwenden.&lt;br /&gt;
Als Beispiel sei für das Interface&lt;br /&gt;
{{java|code=&lt;br /&gt;
public interface Transform {&lt;br /&gt;
    String calc(int value);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
ein Mock definiert durch:&lt;br /&gt;
{{java|code=Transform trans = Mockito.mock(Transform.class);}}&lt;br /&gt;
&lt;br /&gt;
Um das Verhalten der Methode {{java|calc}} zu definieren bauen wir ein Objekt vom Typ {{java|Answer&amp;lt;T&amp;gt;}}.&lt;br /&gt;
Der Typ {{java|T}} wird ersetzt durch den Ergebnis-Typ der zu mockenden Methode -- in diesem Falle {{java|String}}.&lt;br /&gt;
&lt;br /&gt;
Das {{java|Answer&amp;lt;T&amp;gt;}}-Objekt muß eine Methode überschreiben die ein Objekt der Klasse {{java|InvocationOnMock}}&lt;br /&gt;
als Argument nimmt. Über dieses Objekt erhalten wir Informtionen zu den Argumenten beim Aufruf der Mock-Methode.&lt;br /&gt;
Wir können sie mit der Methode {{java|getArgument}} über ihren Index abrufen, der Index beginnt bei 0.&lt;br /&gt;
Für die weiteren Methoden der Klasse sei auf die API-Dokumentation verwiesen.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir dazu eine konkrete Implementierung.&lt;br /&gt;
&lt;br /&gt;
==== when ... thenAnswer ====&lt;br /&gt;
Die erste Variante nennt &amp;#039;&amp;#039;erst&amp;#039;&amp;#039; den Mock und &amp;#039;&amp;#039;dann&amp;#039;&amp;#039; die zu mockende Methode:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.when(trans.calc(Mockito.anyString())).thenAnswer(new Answer&amp;lt;String&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public String answer(InvocationOnMock invocation) throws Throwable {&lt;br /&gt;
        Integer value = invocation.getArgument(0);&lt;br /&gt;
        return value.toString();&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
}}&lt;br /&gt;
Mit Java-8 läßt sich die anonyme Klasse auch eleganter mit einem {{lambda}}-Ausdruck schreiben:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.when(trans.calc(Mockito.anyString())).thenAnswer(&lt;br /&gt;
   (Answer&amp;lt;String&amp;gt;) invocation -&amp;gt; {&lt;br /&gt;
       Integer value = invocation.getArgument(0);&lt;br /&gt;
       return value.toUpperCase();&lt;br /&gt;
   }&lt;br /&gt;
);&lt;br /&gt;
}}&lt;br /&gt;
Der Ergebnis-Typ von {{java|getArgument}} wird hier durch die Variable bestimmt der das Ergebnis zugewiesen wird.&lt;br /&gt;
Ob die Argument-Typen tatsächlich übereinstimmen, kann Java zur Compile-Zeit leider nicht kontrollieren.&lt;br /&gt;
Der Entwickler muß also selber darauf achten, daß alle Typen korrekt angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur anonymen-Klasse-Variante kann im {{lambda}}-Ausdruck der Ergebnis-Typ {{java|Answer&amp;lt;String&amp;gt;}} &lt;br /&gt;
weggelassen werden. Man sollte ihn aber trotzdem hinschreiben, damit der Typ dokumentiert ist – man tut sich damit&lt;br /&gt;
bei der Fehlersuche erheblich leichter.&lt;br /&gt;
&lt;br /&gt;
In den obigen Beispielen werden die Argumente vor Gebrauch in lokale Variablen abgefüllt, bevor diese im return-Ausdruck&lt;br /&gt;
verwendet werden. Das ist in der Regel nicht erforderlich, man kann die Typen von der Java-Magie bestimmern lassen.&lt;br /&gt;
Die geschwätzige Variante mit den lokalen Variablen hat aber den Vorteil, daß die Typen auf den ersten Blick zu erkennen&lt;br /&gt;
sind. Werden schrecklich Methoden mit vielen Parametern aufgerufen, wird das schnell zum Geduldspiel.&lt;br /&gt;
&lt;br /&gt;
==== doAnswer ... when ====&lt;br /&gt;
Bei dieser Variante wird &amp;#039;&amp;#039;erst&amp;#039;&amp;#039; die Answer definiert und &amp;#039;&amp;#039;hinterher&amp;#039;&amp;#039; der Mock und die aufzurufende Methode.&lt;br /&gt;
Auch hier gewinnt der Aufruf durch die Verwendung von {{lambda}}-Ausdrücken durchaus an Lesbarkeit --&lt;br /&gt;
wir lassen die konventionelle Variante diesmal weg:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.doAnswer(&lt;br /&gt;
    (Answer&amp;lt;String&amp;gt;) invocation -&amp;gt; {&lt;br /&gt;
        Integer value = invocation.getArgument(0);&lt;br /&gt;
        return value.toString();&lt;br /&gt;
    }&lt;br /&gt;
).when(trans.calc(Mockito.anyString()));&lt;br /&gt;
}}&lt;br /&gt;
Das Konstrukt funktioniert genauso wie das im vorangegangenen Abschnitt beschrieben.&lt;br /&gt;
&lt;br /&gt;
Allerdings kann man den Aufruf auch subtil anders gestalten (hier wird nur die {{lambda}}-Variante wiedergegeben):&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.doAnswer(&lt;br /&gt;
    (Answer&amp;lt;String&amp;gt;) invocation -&amp;gt; {&lt;br /&gt;
        Integer value = invocation.getArgument(0);&lt;br /&gt;
        return value.toString();&lt;br /&gt;
    }&lt;br /&gt;
).when(trans).calc(Mockito.anyString());&lt;br /&gt;
}}&lt;br /&gt;
Der Unterschied liegt in der letzten Zeile. Im ersten Falle wird {{java|.when()}} mit dem Mock der gemockten &amp;#039;&amp;#039;Methode&amp;#039;&amp;#039; aufgerufen.&lt;br /&gt;
Im zweiten Falle wird {{java|.when()}} mit dem Mock der gemockten &amp;#039;&amp;#039;Klasse&amp;#039;&amp;#039; aufgerufen. Die zweite Variante macht das&lt;br /&gt;
Mocking von void-Methoden möglich und erlaubt, einzelne Methoden von Spy-Objekten zu mocken und damit [[Partieller Mock|partielle Mocks]] zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== void-Methoden: Methoden ohne Ergebnis ===&lt;br /&gt;
Eine void-Methode ist eine Methode, die kein Ergebnis liefert – was sollte man hier mocken?&lt;br /&gt;
Betrachten wir dazu folgendes Beispiel:&lt;br /&gt;
{{java|code=&lt;br /&gt;
public class CustomerManager {&lt;br /&gt;
    public void save(Customer customer) {&lt;br /&gt;
        getDatabaseLink().merge(customer);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Die {{java|save}}-Methode nimmt als Parameter ein Entity und persistiert dessen Inhalt in der Datenbank. &lt;br /&gt;
Das ist etwas, was wir im Unit-Test normalerweise nicht tun möchten. Wir würden stattdessen &lt;br /&gt;
den vielleicht den Aufruf protokollieren oder die Persistierung in einem Java-Objekt emulieren.&lt;br /&gt;
&lt;br /&gt;
Beim Mocking geht es also darum, beim Ausführen der gemockten void-Methode einen Seiteneffekt herbeizuführen.&lt;br /&gt;
Wie bereits beschrieben, giebt es prinzipiell zwei Muster nach denen sich in Mockito Methoden-Verhalten&lt;br /&gt;
implementieren läßt. Im Falle von void-Methoden fällt das when...then-Pattern jedoch aus, da die&lt;br /&gt;
Methode {{java|Mockito.when()}} keine void-Methoden verdauen kann.&lt;br /&gt;
&lt;br /&gt;
Wir erzeugen also erstmal einen Mock:&lt;br /&gt;
{{java|code=Transform mock = Mockito.mock(CustomerManager.class);}}&lt;br /&gt;
und definieren die Antwort so:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.doAnswer(new Answer&amp;lt;Void&amp;gt;() {&lt;br /&gt;
    @Override&lt;br /&gt;
    public Void answer(InvocationOnMock invocation) throws Throwable {&lt;br /&gt;
        // Seiteneffekt&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
}).when(mock).save(Mockito.any(Customer.class));&lt;br /&gt;
}}&lt;br /&gt;
Der Trick ist die Verwendung der – übrigens schon seit JDK 1.1 existierenden – Klasse {{java|Void}}(mit großem Vau).&lt;br /&gt;
Zu jedem primitiven Typ gibt es in Java eine passende Wrapper-Klasse; ein Analogon hat der Ergebnis-Typ {{java|void}} in der&lt;br /&gt;
{{java|Void}}-Klasse. Da es keine {{java|void}}-Werte giebt, giebt es auch keine Instanzen der {{java|Void}}-Klasse;&lt;br /&gt;
die Klasse selbst gibt es aber und hier finden wir eine Gelegenheit sie zu nutzen: wir definieren damit den Ergebnis-Typ&lt;br /&gt;
der Answer-Methode. &lt;br /&gt;
&lt;br /&gt;
Da {{java|Void}} – im Gegensatz zu {{java|void}} – eine Klasse ist, muß die {{java|answer}}-Methode ein Ergebnis liefern und&lt;br /&gt;
benötigt daher am Ende die Anweisung {{java|return null}}.&lt;br /&gt;
&lt;br /&gt;
Natürlich läßt sich das auch mit einem {{lambda}}-Ausdruck schreiben:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Mockito.doAnswer((Answer&amp;lt;Void&amp;gt;) invocation -&amp;gt; {&lt;br /&gt;
    // Seiteneffekt&lt;br /&gt;
    return null;&lt;br /&gt;
}).when(mock).save(Mockito.any(Customer .class));&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Methoden mit Variablen Argument-Listen ===&lt;br /&gt;
Weichen wir mal der Diskussion aus, ob Var-Arg-Methoden schön, sinnvoll oder wünschenswert sind und welche&lt;br /&gt;
Probleme sie mit sich bringen (könnten). Nehmen wir einfach an, wir hätten so ein Ding und &amp;#039;&amp;#039;müßten&amp;#039;&amp;#039; es mocken -- wie geht das?&lt;br /&gt;
Die Methode {{java|process}} akzeptiere eine beliebige Anzahl von {{java|Customer}}-Objekten, tue irgendwas damit und liefere&lt;br /&gt;
die Anzahl der verarbeiteten Objekte.&lt;br /&gt;
{{java|code=&lt;br /&gt;
public interface Transform {&lt;br /&gt;
    int process(Customer... customer);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Wie bereits beschrieben, können wir über ein Objekt der Klasse {{java|InvocationOnMock}} auf die Argumente zugreifen&lt;br /&gt;
die beim Aufruf der gemockten Methode übergeben werden. Die vararg-Argumente erhalten wir so als array und können z.B.&lt;br /&gt;
mit einer for-Schleife darüber iterieren. Versuchen wir es hier etwas hübscher aussehen zu lassen, indem wir das array in&lt;br /&gt;
eine typisierte Liste überführen.&lt;br /&gt;
&lt;br /&gt;
Wir schreiben zunächst die Mock-Methode mit dem doAnswer...when-Pattern:&lt;br /&gt;
{{java|code=&lt;br /&gt;
void test() {&lt;br /&gt;
    Mockito.doAnswer(new Answer&amp;lt;Integer&amp;gt;() {&lt;br /&gt;
        @Override&lt;br /&gt;
        public Integer answer(InvocationOnMock invocation) throws Throwable {&lt;br /&gt;
            List&amp;lt;Customer&amp;gt; kunden = argliste(invocation.getArguments());&lt;br /&gt;
            return kunden.size();&lt;br /&gt;
        }&lt;br /&gt;
    }).when(mock).process(Mockito.any());&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Und nun zur {{java|.argliste()}}-Methode, die das Object-array in ein {{java|List&amp;lt;Customer&amp;gt;}}-Objekt umwandelt. Es giebt&lt;br /&gt;
viele Möglichkeiten, die elegantesten arbeitet natürlich mit einem Stream. Das Delikate daran ist das erforderliche Casting, wir&lt;br /&gt;
verwenden dazu die .class-Klasse für die Customer-Klasse:&lt;br /&gt;
{{java|code=&lt;br /&gt;
List&amp;lt;Customer&amp;gt; argliste(Object liste[]) {&lt;br /&gt;
    return Stream.of(liste)&lt;br /&gt;
        .filter(Customer.class::isInstance)&lt;br /&gt;
        .map(Customer.class::cast)&lt;br /&gt;
        .collect(Collectors.toList());&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Was hierbei nicht offensichtlich ist, ist daß die {{java|arguments}}-Methode von {{java|InvocationOnMock}}&lt;br /&gt;
&amp;#039;&amp;#039;alle&amp;#039;&amp;#039; Argumente liefert –- nicht nur die vararg-Argumente. Im folgenden Beispiel&lt;br /&gt;
{{java|int process(String beschreibung, Customer... customer);}}&lt;br /&gt;
liefert {{java|.arguments()[0]}} das Argument für den String-Parameter und erst ab {{java|.arguments()[1]}} kommen die vararg-Argumente.&lt;br /&gt;
Die obige Methode {{java|argliste}} funktioniert auch in diesem Falle unmittelbar, weil der nicht-variable Teil der ParameterListe&lt;br /&gt;
keine {{java|Customer}}-Objekte enthält. Das String-Argument wird einfach herausgefiltert.&lt;br /&gt;
Anders sieht es in diesem Beispiel aus:&lt;br /&gt;
{{java|code=int process(Customer referenz, String beschreibung, Customer... customer);}}&lt;br /&gt;
Offensichtlich soll das erste Customer-Objekt anders behandelt werden als die der vararg-Liste. Aber auch das geht&lt;br /&gt;
mit Streams ganz einfach. Wir müssen ja nur die ersten beiden Argumente bei der Verarbeitung überspringen; das&lt;br /&gt;
geht mit der {{java|.skip()}}-Methode:&lt;br /&gt;
{{java|code=&lt;br /&gt;
List&amp;lt;Customer&amp;gt; argliste(Object liste[]) {&lt;br /&gt;
    return Stream.of(liste)&lt;br /&gt;
        .skip(2)&lt;br /&gt;
        .filter(Customer.class::isInstance)&lt;br /&gt;
        .map(Customer.class::cast)&lt;br /&gt;
        .collect(Collectors.toList());&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Und wenn wir die Methode noch öfter brauchen, können wir den start-Index (beginnend bei 0) und das verwendete&lt;br /&gt;
{{java|Class}}-Objekt noch parametrisieren:&lt;br /&gt;
{{java|code=&lt;br /&gt;
&amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; argliste(Object liste[], int startIndex, Class&amp;lt;T&amp;gt; klasse) {&lt;br /&gt;
    return Stream.of(liste)&lt;br /&gt;
        .skip(startIndex)&lt;br /&gt;
        .filter(klasse::isInstance)&lt;br /&gt;
        .map(klasse::cast)&lt;br /&gt;
        .collect(Collectors.toList());&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Diese letzte Variante können wir nun für das Mocking jeder Varag-Methode für jeden Varag-Typ verwenden.&lt;br /&gt;
&lt;br /&gt;
== Abstrakte Klassen mocken ==&lt;br /&gt;
Der gemeine Mockito-Mock ersetzt alle Methoden der gemockten Klasse durch leere Mock-Aufrufe die –&lt;br /&gt;
defaultmäßig – gar nichts tun. Das kann man verhindern durch Angabe eines zusätzlichen Parameters:&lt;br /&gt;
{{java|code=MeineKlasse meinMock = mock(MeineKlasse.class, Mockito.CALLS_REAL_METHODS);}}&lt;br /&gt;
&lt;br /&gt;
Wird jetzt eine Methode des Mocks aufgerufen, ruft dieser die originale Methode der Klasse {{java|MeineKlasse}} auf.&lt;br /&gt;
Anschließend kann man einzelne Methoden mocken und so einen partiellen Mock zu erzeugen.&lt;br /&gt;
Bei abstrakten Klassen tritt der Mock in&amp;#039;s leere, sobald eine abstrakte Methode aufgerufen wird, weil es für diese&lt;br /&gt;
naturgemäß keine &amp;quot;echte&amp;quot; Methode giebt, die aufgerufen werden könnte. Um eine abstrakte Klasse so zu mocken,&lt;br /&gt;
daß genau die abstrakten Methoden gemockt werden, muß man also jede abstrakte Methode durch eine mock-Methode ersetzen – wie öde...&lt;br /&gt;
Mit der folgenden Klasse kann man das – Reflection sei dank – vollautomatisch erledigen lassen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
import java.lang.reflect.Modifier;&lt;br /&gt;
...&lt;br /&gt;
public class MockerForAbstractMethods implements Answer&amp;lt;Object&amp;gt; {&lt;br /&gt;
    @Override&lt;br /&gt;
    public Object answer(InvocationOnMock invocation) throws Throwable {&lt;br /&gt;
        if (Modifier.isAbstract(invocation.getMethod().getModifiers())) {&lt;br /&gt;
            return Mockito.RETURNS_DEFAULTS.answer(invocation);&lt;br /&gt;
        }&lt;br /&gt;
        return Mockito.CALLS_REAL_METHODS.answer(invocation);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Diese Klasse legt man an geeigneter Stelle ab, irgendwo im test-Ordner des Projekts. Die Anwendung im Unit-Tests&lt;br /&gt;
sieht dann so aus:&lt;br /&gt;
{{java|code=MeineKlasse meinMock = mock(MeineKlasse.class, new MockerForAbstractMethods());}}&lt;br /&gt;
&lt;br /&gt;
Das Objekt prüft bei jedem Aufruf ob da eine abstrakte Methode aufgerufen wird und ersetzt den Aufruf durch einen&lt;br /&gt;
Mock-Aufruf. Ist die Methode nicht abstrakt, wird die &amp;quot;echte&amp;quot; Methode aufgerufen. Um das ganze in der Anwendung&lt;br /&gt;
etwas gefälliger zu machen, kann man die Instanz statisch erzeugen und eine Konstante dafür definieren:&lt;br /&gt;
{{java|code=public static final Answer&amp;lt;Object&amp;gt; MOCK_ABSTRACT_METHODS = new MockerForAbstractMethod();}}&lt;br /&gt;
Die Konstante kann man statisch importieren und dann schreiben:&lt;br /&gt;
{{java|code=MeineKlasse meinMock = mock(MeineKlasse.class, MOCK_ABSTRACT_METHODS);}}&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>