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 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