122 votes

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

Je veux simuler une méthode statique m1 à partir d'une classe qui contient 2 méthodes statiques, m1 et m2. Et je veux que la méthode m1 renvoie un objet.

J'ai essayé ce qui suit

1)

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

Cela appelle à la fois m1 et m2, qui a un type de retour différent, ce qui entraîne une erreur de type de retour non concordant.

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

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

167voto

Tom Tresansky Points 5423

Ce que vous voulez faire, c'est une combinaison d'une partie de 1 et de la totalité de 2.

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

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

A partir de la javadoc :

Crée une classe fictive avec une stratégie spécifiée pour la interactions. Il s'agit d'une fonctionnalité assez avancée et typiquement vous n'en avez pas besoin pour écrire des tests décents. Cependant, elle 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 lorsque l'appel de la méthode n'est pas supprimé.

Les par défaut La stratégie de blocage par défaut consiste à renvoyer simplement null, 0 ou false pour les méthodes à valeur d'objet, de nombre et de booléen. En utilisant la surcharge à 2 arguments, vous dites "Non, non, non, par défaut, utilisez la méthode answer de cette sous-classe Answer pour obtenir une valeur par défaut. Elle renvoie un Long, donc si vous avez des méthodes statiques qui renvoient quelque chose d'incompatible avec Long, il y a un problème.

Au lieu de cela, utilisez la version 1arg de mockStatic pour permettre le stubbing des méthodes statiques, puis utilisez when-thenReturn pour spécifier ce qu'il faut faire 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 de chaîne est bloquée pour renvoyer "Hello !", tandis que la méthode statique à valeur d'entrée utilise le blocage par défaut et renvoie 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X