web-dev-qa-db-fra.com

PowerMockito simule une méthode statique unique et renvoie un objet

Je veux me moquer d'une méthode statique m1 d'une classe contenant 2 méthodes statiques, m1 et m2. Et je veux que la méthode m1 renvoie un objet.

J'ai essayé le suivant

1)

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

Ceci appelle m1 et m2, qui ont un type de retour différent, ce qui donne une erreur d’écart de correspondance.

2) PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l); Mais ceci n'est pas appelé lorsque m1 est exécuté.

3) PowerMockito.mockPartial(Static.class, "m1"); Donne au compilateur une erreur indiquant que mockPartial n'est pas disponible, ce que j'ai obtenu de http://code.google.com/p/powermock/wiki/MockitoUsage .

83
user1393653

Ce que vous voulez faire est une combinaison d'une partie de 1 et de 2.

Vous devez utiliser PowerMockito.mockStatic pour activer le mocking statique pour toutes les méthodes statiques d'une classe. Cela signifie qu'il est possible de les stub en utilisant la syntaxe when-thenReturn.

Mais la surcharge de 2 arguments de mockStatic que vous utilisez fournit une stratégie par défaut pour ce que Mockito/PowerMock devrait faire lorsque vous appelez une méthode que vous n’avez pas explicitement stubée sur l’instance fictive.

De la javadoc :

Crée une classe fictive avec une stratégie spécifiée pour ses réponses aux interactions. C'est une fonctionnalité assez avancée et généralement vous n'en avez pas besoin pour écrire des tests corrects. Cependant, cela peut être utile lorsque vous travaillez avec des systèmes hérités. C'est la réponse par défaut, elle ne sera donc utilisée que si vous ne stubez pas l'appel de la méthode.

La stratégie de stubbing par défaut par défaut consiste à renvoyer null, 0 ou false pour les méthodes à objet, nombre et valeur booléenne. En utilisant la surcharge à 2 arguments, vous dites "Non, non, non, par défaut, utilisez cette méthode de réponse de la sous-classe de réponse pour obtenir une valeur par défaut. Elle renvoie un long, donc si vous avez des méthodes statiques qui retournent quelque chose incompatible Longtemps, il y a un problème.

Au lieu de cela, utilisez la version à un argument de mockStatic pour activer le stubbing de méthodes statiques, puis utilisez when-thenReturn pour spécifier l'action à effectuer pour une méthode particulière. Par exemple:

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());
  }
}

La méthode statique à valeur String est stubbed pour renvoyer "Hello!", Tandis que la méthode statique à valeur int utilise le stubbing par défaut, renvoyant 0.

118
Tom Tresansky