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