Ich habe einen Code wie diesen unten:
Class A {
public boolean myMethod(someargs) {
MyQueryClass query = new MyQueryClass();
Long id = query.getNextId();
// some more code
}
}
Class MyQueryClass {
....
public Long getNextId() {
//lot of DB code, execute some DB query
return id;
}
}
Jetzt schreibe ich einen Test für A.myMethod(someargs)
. Ich möchte die reale Methode überspringen query.getNextId()
und stattdessen einen Stub-Wert zurückgeben. Grundsätzlich möchte ich verspotten MyQueryClass
.
In meinem Testfall habe ich also Folgendes verwendet:
MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);
boolean b = A.getInstance().myMethod(args);
//asserts
Ich habe @RunWith(PowerMockRunner.class)
und @PrepareForTest({MyQueryClass.class})
am Anfang meiner Testklasse verwendet.
Aber wenn ich den Test debugge, ruft er immer noch die eigentliche Methode getNextId()
der MyQueryClass
Klasse auf.
Was vermisse ich hier? Kann mir jemand helfen, da ich neu bei Mockito und PowerMockito bin.
Wie @TrueDub in seiner akzeptierten Antwort erwähnt hat, müssen Sie die Klasse hinzufügen, in der der Konstruktor aufgerufen wird
@PrepareForTest
.Wenn Sie dies tun, ist die von Eclemma und Sonar gemeldete Abdeckung für diese Klasse für diese Klasse Null
Powermockito Wiki
Die Lösung hier wäre also, den tatsächlichen Code umzugestalten, um eine statische Factory zu verwenden, die eine Instanz dieser Klasse zurückgibt und sie dann statisch verspottet.
quelle
Vielleicht können Sie einfach verwenden
quelle