Wie android unit Tests und mock eine statische Methode
Hallo zusammen ich hoffe wirklich Ihr könnt mir helfen, ich fühle mich wie ich ve wurde mein Haar ziehen seit Tagen.
Ich bin versucht, zu schreiben unit-tests für die Methode A. Methode A ruft eine statische Methode B. mock-statischen Methode B.
Ich weiß, dies wurde gebeten vor, aber ich denke, Android ist erwachsen geworden seit dann, und es muss ein Weg zu einer so einfachen Aufgabe ohne re-schreiben die Methoden, die ich testen möchte.
Hier ist ein Beispiel, zuerst die Methode, die ich testen möchte:
public String getUserName(Context context, HelperUtils helper) {
if(helper == null){
helper = new HelperUtils();
}
int currentUserId = helper.fetchUsernameFromInternet(context);
if (currentUserId == 1) {
return "Bob";
} else {
return "Unknown";
}
}
Neben der statischen Methode ich möchte mock:
public class HelperUtils {
public static int fetchUsernameFromInternet(Context context) {
int userid = 0;
Log.i("HelperUtils ", "hello");
return userid;
}
}
In anderen Sprachen ist dies so einfach, aber ich kann einfach nicht damit es funktioniert in Android.
Ich habe versucht, Mockito, aber es wird angezeigt, statische Methoden werden nicht unterstützt
HelperUtils helper = Mockito.mock(HelperUtils.class);
Mockito.when(helper.fetchUsernameFromInternet(getContext())).thenReturn(1);
Dieser Fehler
org.mockito.Ausnahmen.missbrauchen.MissingMethodInvocationException
Habe ich versucht, Powermock, aber ich bin mir nicht ganz sicher, dies wird unterstützt durch Android. Ich schaffte es, powermock läuft mit androidCompile in meinem gradle-Datei, aber ich bekomme diese Fehlermeldung:
Error:Execution failed for task ':app:dexDebugAndroidTest'. com.android.ide.common.Prozess.ProcessException:
Nicht zu erwähnen PowerMockito.mockStatic(HelperUtils.class);
nichts zurückgibt, also ich weiß nicht, was zu passieren in meinem getUsername-Methode!
Jede Hilfe wäre sehr geschätzt.
- Ich habe nicht eine richtige Antwort, aber ich ging vor kurzem um singletons und statische Klassen, indem Sie Sie mit einem service-locator-Muster. Es machte Sie leicht getestet werden und dauerte ein paar Minuten, für jede Klasse zu konvertieren.
- Ich weiß nicht so viel über die Tests in den anderen Sprachen, aber in Java
static
ist der Feind des Tests. - Möchten Sie vielleicht einen Blick auf PowerMock (github.com/jayway/powermock). Es ist ein test-framework, das ermöglicht Ihnen das testen von schwierigen Fällen.
- PowerMockito gibt nur PowerMock Mockito-Geschmack-API, technisch tun Sie beide das gleiche
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statische Methoden nicht im Zusammenhang mit der Objekt - Ihre
helper.fetchUsernameFromInternet(...)
ist die gleiche (aber ein bisschen verwirrend) alsHelperUtils.fetchUsernameFromInternet(...)
- sollten Sie einmal eine compiler-Warnung aufgrund dieserhelper.fetchUsernameFromInternet
.Was mehr ist, anstelle der
Mockito.mock
zu verspotten statische Methoden, die Sie verwenden müssen:@RunWith(...)
,@PrepareForTest(...)
und dannPowerMockito.mockStatic(...)
- vollständiges Beispiel ist hier: PowerMockito mock einzelne statische Methode und Rendite-ObjektIn anderen Worten mocking - statische Methoden (auch Konstruktoren) ist ein bisschen tricky. Die bessere Lösung ist:
wenn Sie ändern, können
HelperUtils
machen, dass die Methode nicht-statisch, und jetzt können Sie mockHelperUtils
mit den üblichenMockito.mock
wenn Sie nicht ändern können
HelperUtils
erstellen Sie eine wrapper-Klasse, welche die Delegierten der originalHelperUtils
ist, aber nichtstatic
Methoden, und dann auch mit üblichenMockito.mock
(diese Idee wird manchmal auch als "don' T mock-Typen, die Sie nicht besitzen")Habe ich auf diese Weise mit PowerMockito.
Ich bin mit
AppUtils.class
es enthält mehrere statische Methoden und die Funktionen.Statische Funktion:
Test-Fall:
Edit 1:
Fügen Sie folgenden Importe:
Hoffe, dass dies Ihnen helfen würde.