webentwicklung-frage-antwort-db.com.de

PowerMockito simuliert eine einzelne statische Methode und gibt ein Objekt zurück

Ich möchte eine statische Methode m1 aus einer Klasse verspotten, die zwei statische Methoden enthält, m1 und m2. Und ich möchte, dass die Methode m1 ein Objekt zurückgibt.

Ich habe folgendes versucht

1)

PowerMockito.mockStatic(Static.class, new Answer<Long>() {
         @Override
         public Long answer(InvocationOnMock invocation) throws Throwable {
            return 1000l;
         }
      });

Dies ruft sowohl m1 als auch m2 auf, die einen anderen Rückgabetyp haben, so dass ein Rückgabetyp-Nichtübereinstimmungsfehler auftritt.

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); Dies wird jedoch nicht aufgerufen, wenn m1 ausgeführt wird.

3) PowerMockito.mockPartial(Static.class, "m1"); Gibt den Compiler-Fehler zurück, dass mockPartial nicht verfügbar ist, den ich von http://code.google.com/p/powermock/wiki/MockitoUsage erhalten habe.

83
user1393653

Was Sie tun möchten, ist eine Kombination aus einem Teil von 1 und allen 2.

Sie müssen PowerMockito.mockStatic verwenden, um enable die statische Verspottung für alle statischen Methoden einer Klasse durchzuführen. Dies bedeutet, dass es möglich ist möglich ist, sie mit der when-thenReturn-Syntax zu stubgen.

Die 2-Argumente-Überladung von mockStatic, die Sie verwenden, liefert eine Standardstrategie für das, was Mockito/PowerMock tun sollte, wenn Sie eine Methode aufrufen, die Sie nicht explizit in der Mock-Instanz blockiert haben.

Aus dem javadoc :

Erstellt einen Klassenspott mit einer festgelegten Strategie für die Antworten auf Interaktionen. Es ist eine ziemlich fortschrittliche Funktion, die Sie normalerweise nicht benötigen, um anständige Tests zu schreiben. Es kann jedoch hilfreich sein, wenn Sie mit älteren Systemen arbeiten. Dies ist die Standardantwort und wird nur verwendet, wenn Sie den Methodenaufruf nicht unterbrechen.

Die default Standard-Stubbing-Strategie besteht darin, für Methoden mit Objekt-, Zahlen- und Booleschen Werten einfach null, 0 oder false zurückzugeben. Wenn Sie die 2-arg-Überladung verwenden, sagen Sie "Nein, nein, nein, verwenden Sie standardmäßig die Antwortmethode dieser Antwort-Unterklasse, um einen Standardwert zu erhalten. Sie gibt einen Long zurück. Wenn Sie also statische Methoden haben, die etwas zurückgeben, das nicht kompatibel ist Lange gibt es ein Problem.

Verwenden Sie stattdessen die 1-Argument-Version von mockStatic, um das Stubbing statischer Methoden zu aktivieren, und geben Sie dann mit when-thenReturn an, was für eine bestimmte Methode zu tun ist. Beispielsweise:

import static org.mockito.Mockito.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class ClassWithStatics {
  public static String getString() {
    return "String";
  }

  public static int getInt() {
    return 1;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
  @Test
  public void test() {
    PowerMockito.mockStatic(ClassWithStatics.class);

    when(ClassWithStatics.getString()).thenReturn("Hello!");

    System.out.println("String: " + ClassWithStatics.getString());
    System.out.println("Int: " + ClassWithStatics.getInt());
  }
}

Die statische Methode mit String-Werten gibt "Hello!" Zurück, während die statische Methode mit Int-Werten das Standard-Stubbing verwendet und 0 zurückgibt.

118
Tom Tresansky