Se moquer de toutes les instances d'une classe
Je sais que c'est généralement une mauvaise pratique, mais dans mon cas elle est nécessaire.
J'ai un cas où un Enum est titulaire d'une classe à acquérir de l'information. De sorte que Enum crée une instance de cette calss dans son Constructeur.
public enum MyEnum {
CONSTANT(new MyImpl());
private final MyImpl myImpl;
private MyEnum(final MyImpl impl) {
this.myImpl = impl;
}
public void sayHello() {
System.out.println(this.myImpl.getSomethingToSay());
}
}
MyImpl.java
est juste une classe avec une méthode unique qui retourne une Chaîne de caractères.
public class MyImpl {
public String getSomethingToSay() {
return "Hello!";
}
}
Maintenant, enfin, l'unité de test:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
@RunWith(MockitoJUnitRunner.class)
@PrepareForTest({ MyImpl.class, MyEnum.class })
public class MyEnumTest extends PowerMockTestCase {
@Test
public void testSmth2() throws Exception {
MyImpl impl = Mockito.mock(MyImpl.class);
Mockito.when(impl.getSomethingToSay()).thenReturn("It works!");
PowerMockito.whenNew(MyImpl.class).withAnyArguments().thenReturn(impl);
System.out.println(impl.getSomethingToSay());
System.out.println(new MyImpl().getSomethingToSay());
MyEnum.CONSTANT.sayHello();
}
}
La sortie est:
It works!
Hello!
Hello!
Mais devrait être 3 fois ça marche!!!
Même si vous pouvez obtenir
Mais quand je veux déplacer les moqueries bloc dans un bloc statique,
Je ne suis pas tout à fait sûr que c'est pertinent...
J'ai mal compris votre premier commentaire. Bon alors, qu'en se moquant de la Enum lui-même?
Ne PowerMock laissez-vous vous moquez des Énumérations? Même si c'est le cas, je ne pense pas que c'est une bonne idée.
whenNew
être utilisé autant de fois que vous le souhaitez, ça va encore seulement si vous le pouvez spécifier que avant enum est initialisée et si vous pouvez le faire, il sera utilisé de cette façon pour tous tests jusqu'à ce que vous obtenez un nouveau chargeur de classe. Je voudrais vraiment essayer de repenser ce - se moquant d'une dépendance à partir d'un enum est vraiment, vraiment méchant.Mais quand je veux déplacer les moqueries bloc dans un bloc statique,
System.out.println(new MyImpl().getSomethingToSay());
serait encore de retour Hello!
Je ne suis pas tout à fait sûr que c'est pertinent...
J'ai mal compris votre premier commentaire. Bon alors, qu'en se moquant de la Enum lui-même?
Ne PowerMock laissez-vous vous moquez des Énumérations? Même si c'est le cas, je ne pense pas que c'est une bonne idée.
OriginalL'auteur Zarathustra | 2013-12-27
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la pièce défectueuse.
J'ai changé
à
Maintenant les moqueries des œuvres. Mais je dois dire que comme Jon Skeet imprimé, l'enum n'a pas partout qui se sont moqués des membres de l'instance. Dans un autre test de l'Unité d'appel
MyEnum.CONSTANT.sayHello();
impression sera de nouveauit works
au lieu deHello!
.OriginalL'auteur Zarathustra