Klasse mit Mockito simulieren

Diskutiere Klasse mit Mockito simulieren im Allgemeine Java-Themen Bereich.
C

Caliburns

Hallo,

ich möchte eine Klasse testen.

hierfür lege zunächst folgendes an:

@Before
Test new = new Test(null, 4);

Ein Parameter ist null, da ursprünglich der Konstruktor an dieser Stelle ein Objekt der Klasse XYZ möchte.

Diese Konstellation funktioniert auch für einige Tests, jedoch benötigen manche Tests ein reelles XYZ Objekt um korrekt abzulaufen, da mir sonst eine NullPointerException geworfen wird.

Die Idee ist nun, für diese Klasse mit Mockito ein Objekt zu simulieren, das an diesen Konstruktor übergeben werden kann.

Leider bin ich noch nicht weiter als:

XYZ newMock= mock(XYZ.class);

gekommen. Wenn ich dieses Objekt übergeben will, bleibt es bei der NullPointerException. Ich bin absolut neu auf diesem Gebiet, und habe im Internet nichts gefunden.
Dort steht meistens noch zusätzlich when().then() etc., was auch nachvollziehbar ist, wenn ein bestimmter Wert ausgegeben soll, wenn eine Methode der simulierten Klasse aufgerufen wird. In meinem Fall geht es aber um eine komplette Instanz einer Klasse deren Konstruktor privat ist.

Danke und Viele Grüße
 
L

LimDul

Das was du tust, ist schon richtig. Du dürftest jetzt aber eine "andere" Nullpointer Exception bekommen.
Beispielcode der Klasse Test:

Java:
public void doSomething() {
  xyz.getSomething().doSomethingElse();
}
Vorher war xyz null, dann flog die NPE bei getSomeSomething() da die Variable xyz null war.
Jetzt tübergibst du ein Gemocketes Objekt, damit ist xyz nicht mehr Null. Aber bei einem gemockten Objekt sind die Rückgaben sämtlicher Funktionen null - das heißt, beim Aufruf von doSomethingElse kommt eine NPE, da getSomething() null geliefert hat.

In solchen Fällen bleibt dir nichts anderes übrig, als die Codestellen wo die NPE geworfen wurde, genau anzusehen und entsprechend mehr zu mocken.

Also:
Java:
XYZ xyz = Mockito.mock(XYZ.class);
Mockito.when(xyz.getSomething).thenReturn(Mockito.mock(ReturnClass.class);
Das kann schnell ausufern. Je mehr es ausufert, desto weniger sinnvoll wird der Test und desto mehr ist es ein Zeichen, dass die Architektur verbessert werden kann, weil die Klassen nicht sauber entkoppelt sind, nicht testbar sind etc.
 
C

Caliburns

Danke für die schnellen Antworten!
Den null-Übeltäter habe ich gefunden, es war tatsächlich ein Rückgabewert einer Methode der null geliefert hat.
Das .thenReturn erwartet allerdings einen boolean-Wert? Ich kann somit keinen Mock von einer beliebigen Klasse zurückgeben lassen?

Auch folgender Umweg funktioniert nicht:

Foo foo = mock(Foo.class);
when(m.foo()).thenReturn(foo);
 
T

thecain

was ist m? was ist Foo?

je nachdem was da sonst so steht sieht das nicht falsch aus...
 
C

Caliburns

Das sollen nur Beispielobjekte bzw. Methoden sein.

XYZ xyz = Mockito.mock(XYZ.class);
Messages m = Mockito.mock(Messages.class);
Mockito.when(xyz.getSomething).thenReturn(m);

Um meine meine ursprüngliche Strukture fortzuführen. Des Rückgabewert von getSomething ist vom Typ Messages.
Aber grundsätzlich soll ja absolut kein boolean-Wert zurückgegeben werden, sondern ja ein weiters Mock-Objekt, das den ursprünglichen Mock xyz "tiefer" aufschlüsselt.
 
T

thecain

Das sieht doch ok aus, bei getSomething müssten noch klammern hin
 
C

Caliburns

Ja das ist klar. Eclipse gibt mir aber folgende Fehlermeldung:

The method thenRetun(Boolean) in the typ OngoingStubbing<Boolean> is not applicable for the arguments (Messages)
 
C

Caliburns

Oh gott ja, habe ich gerade gesehen, ist nicht vom Typ Messages. Also ist das gekoppelt?

EDIT: Ja ist gekoppelt... Ich prüfe in der getSomething auf Null und möchte wenn dies zutrifft ein Messages-Objekt mocken. Gibts dafür eine Möglichkeit?

EDIT 2: Ist gelöst. Habe einfach über die setter das gemockte Messages Objekt gesetzt.

Danke!
 
Zuletzt bearbeitet:
Thema: 

Klasse mit Mockito simulieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben