without mock method example junit static mocking powermock

junit - method - Prueba de PowerMock: establecer el campo estático de la clase



powermock static method example (5)

Prueba esto:

@RunWith(PowerMockRunner.class) @PrepareForTest({Foo.class}) public class FooTest { @Test public void shouldMockPrivateStaticField() throws IllegalAccessException { // given Foo foo = new Foo(); Field field = PowerMockito.field(Foo.class, "b"); field.set(Foo.class, mock(B.class));

No trabaje para envolturas primitivas y primitivas.

Tengo dificultades para encontrar una forma de establecer un campo estático de una clase. Básicamente es así:

public class Foo{ // ... private static B b = null; }

donde B es otra clase.

¿Hay alguna manera de hacer esto en PowerMock que no sea con setInternalStateFromContext() ? Usar el método de clase de contexto parece un poco exagerado para establecer un campo.

Gracias.


Puede usar getAllStaticFields y tratar de configurarlos

Ejemplo:

YourFieldClass newValue; final Set<Field> fields = Whitebox.getAllStaticFields(YourClass.class); for (final Field field : fields) { if (YourFieldClass.class.equals(field.getType())) { // or check by field name field.setAccessible(true); field.set(YourClass.class, newValue); } }


Simplemente lo haces:

Whitebox.setInternalState(Foo.class, b);

donde b es la instancia de B que desea establecer.


aquí voy a establecer el valor para "android.os.Build.VERSION.RELEASE", donde VERSION es el nombre de la clase y RELEASE es el valor final de la cadena estática.

Si el campo subyacente es final, el método arroja una IllegalAccessException a menos que setAccessible (true) haya tenido éxito para este campo y este campo no sea estático, NoSuchFieldException debe agregarse cuando use el método field.set ()

@RunWith(PowerMockRunner.class) @PrepareForTest({Build.VERSION.class}) public class RuntimePermissionUtilsTest { @Test public void hasStoragePermissions() throws IllegalAccessException, NoSuchFieldException { Field field = Build.VERSION.class.getField("RELEASE"); field.setAccessible(true); field.set(null,"Marshmallow"); } }

ahora el valor de String RELEASE devolverá " Marshmallow ".


Whitebox.setInternalState(Foo.class, b);

Funciona siempre que establezca un valor no nulo, y si solo hay un campo con la clase de B Si no puede confiar en ese lujo, debe proporcionar el nombre del campo y convertir el null al tipo que desea establecer. En ese caso, necesitarías escribir algo como esto:

Whitebox.setInternalState( Foo.class, "b", (B)null );