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.