Wie testet man eine statische Methode mit mock () und spy ()

8

Die unten angegebene Methode im Codeabschnitt enthält eine statische Methode, die "with ()" ist. Ich möchte den Code unten testen, also habe ich den Test dieser Methode codiert wie im Testabschnitt gezeigt.

Ich habe versucht, die Methode mit "spy ()" und "mock ()" zu testen, aber der Test schlägt immer fehl.

Bitte lassen Sie mich wissen, wie kann ich eine Methode testen, gibt void zurück?

Code

%Vor%

testen :

%Vor%     
LetsamrIt 18.09.2017, 10:23
quelle

2 Antworten

6

Normalerweise, wenn Sie PowerMock verwenden, ist das ein gutes Zeichen, dass Sie höchstwahrscheinlich auf dem falschen Weg sind.

Was ist, wenn Sie anstatt direkt auf Picasso zu verweisen, eine Komponente erstellen, deren Aufgabe es sein wird, ein Bild zu laden, sagen wir Klasse ImageLoader . Was wird dir das geben?

  • Trennung von Bedenken: Wenn Sie sich morgen entscheiden, zu Glide zu wechseln, sollten Sie nicht jede einzelne Klasse ändern, in der Sie Picasso verwendet haben. Sie werden nur die Implementierung von ImageLoader ändern. Andere Komponenten kennen diese Änderungen nicht, weil sie von einer Abstraktion abhängen, nicht für die Implementierung

  • Naht: Dies ermöglicht Ihnen, Abhängigkeiten leicht nachzuahmen, um Komponententests durchzuführen

Dies wird unsere Abstraktion sein:

%Vor%

Lassen Sie uns eine Implementierung bereitstellen:

%Vor%

Nun, in Ihren Komponenten, wenn Sie Picasso benötigen, verwenden Sie stattdessen ImageLoader .

Damit folgt Ihre Methode:

%Vor%

Dann wird Ihr Test wie folgt aussehen:

%Vor%

Keine Verspottung von static Methode, keine PowerMock benötigt.

    
azizbekian 20.09.2017 19:36
quelle
3

Von der Mockito-FAQ :

  

Was sind die Einschränkungen von Mockito?

     

...

     

Kann statische Methoden nicht vortäuschen

Verwenden Sie stattdessen PowerMock . Hier findest du eine detaillierte Anleitung, wie man die statischen Methoden verspottet.

>

Aktualisieren

Um den PowerMock auf Ihren Test anzuwenden, müssen Sie:

  • Fügen Sie @PrepareForTest auf Testklassenebene hinzu:

    @PrepareForTest(Picasso.class) public class ValidationTest { ... }

  • Rufen Sie PowerMockito.mockStatic() auf, um eine statische Klasse zu erstellen

    PowerMockito.mockStatic(Picasso.class);

  • Verwenden Sie einfach Mockito.when() , um Ihre Erwartungen zu erfüllen:

    Mockito.when(Picasso.with(mCtx)).thenReturn(requestCreator);

Für RequestCreator.class gelten die gleichen Schritte.

P.S. Ich kann Fehler machen, weil ich die API der 3rd-Party-Bibliothek, die Sie verwenden, nicht kenne.

    
mxf 18.09.2017 10:32
quelle