Sé que esto es generalmente una buena práctica, pero en mi caso es necesario.

Tengo un caso donde una Enumeración tiene una clase para ganar algo de información. De modo que la Enumeración crea una instancia de esa calss en su Constructor.

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 es sólo una clase con un método que devuelve una Cadena.

public class MyImpl {

    public String getSomethingToSay() {
        return "Hello!";
    }

}

Ahora, por último, la prueba de la unidad:

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 salida es:

It works!
Hello!
Hello!

Pero debe ser de 3 veces funciona!

Incluso si usted puede conseguir whenNew para ser utilizado tantas veces como quieras, es solo ayuda si usted puede especificar que antes de la enumeración se inicializa – y si se puede hacer eso, que va a ser utilizado de esa manera por todo pruebas hasta conseguir un nuevo cargador de clases. Me gustaría realmente intentar rediseñar este – burla de una dependencia de un enum es realmente desagradable.
Pero cuando me iba a mover a la burla de los bloques de un bloque estático, System.out.println(new MyImpl().getSomethingToSay()); iba a volver Hello!
No estoy muy seguro de lo que es relevante…
No he entendido tu primer comentario. Está bien, entonces, ¿qué acerca de burlarse de la Enumeración de la misma?
¿PowerMock permiten burlarse de las Enumeraciones? Incluso si lo hace, yo no creo que sea una buena idea.

OriginalEl autor Zarathustra | 2013-12-27

1 Comentario

  1. 7

    He encontrado la pieza defectuosa.

    He cambiado

    @RunWith(MockitoJUnitRunner.class)

    a

    @RunWith(PowerMockRunner.class)

    Ahora la burla de las obras. Pero tengo que decir que como Jon Skeet impreso, la enumeración no tiene en todas partes que se burlaban de los miembros de la instancia. Así, en otra Unidad llamada de prueba MyEnum.CONSTANT.sayHello(); va a imprimir de nuevo it works en lugar de Hello!.

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here