How to Android Unit Test und verspotten eine statische Methode

Hi, ich hoffe wirklich, dass du mir helfen kannst. Ich habe das Gefühl, dass ich mir seit Tagen die Haare ausreiße.

Ich versuche, Komponententests für eine Methode A zu schreiben. Methode A ruft eine statische Methode B auf. Ich möchte die statische Methode B verspotten.

Ich weiß, dass dies schon einmal gefragt wurde, aber ich glaube, dass Android seitdem gereift ist und es eine Möglichkeit geben muss, eine so einfache Aufgabe zu erledigen, ohne die Methoden, die ich testen möchte, neu zu schreiben.

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";
    }
}

Nächste die statische Methode, die ich verspotten möchte:

public class HelperUtils {
    public static int fetchUsernameFromInternet(Context context) {
        int userid = 0;

        Log.i("HelperUtils ", "hello");

        return userid;
    }
}

In anderen Sprachen ist das so einfach, aber ich kann es einfach nicht in Android zum Laufen bringen. Ich habe Mockito ausprobiert, aber es scheint, dass statische Methoden nicht unterstützt werden

HelperUtils helper = Mockito.mock(HelperUtils.class);
Mockito.when(helper.fetchUsernameFromInternet(getContext())).thenReturn(1);

Diese Fehler

org.mockito.exceptions.misusing.MissingMethodInvocationException

Ich habe Powermock ausprobiert, bin mir aber nicht sicher, ob dies von Android unterstützt wird. Ich habe es geschafft, Powermock mit androidCompile in meiner Gradle-Datei zum Laufen zu bringen, aber ich erhalte den folgenden Fehler:

Error: Ausführung für Task ': app: dexDebugAndroidTest' fehlgeschlagen. com.android.ide.common.process.ProcessException:

Ganz zu schweigen vonPowerMockito.mockStatic(HelperUtils.class); Gibt nichts zurück, daher weiß ich nicht, was ich an meine getUsername-Methode übergeben soll!

Jede Hilfe wäre so sehr dankbar.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage