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
InformationsquelleAutor James | 2015-08-18
Schreibe einen Kommentar