Подтвердить что ты не робот

Тестирование PowerMock - установить статическое поле класса

Мне трудно найти способ установить статическое поле класса. Это в основном так:

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

где B - другой класс.

Есть ли способ сделать это в PowerMock, кроме как с setInternalStateFromContext()? Использование метода класса контекста кажется немного излишним для установки одного поля.

Спасибо.

4b9b3361

Ответ 1

Whitebox.setInternalState(Foo.class, b);

Работает до тех пор, пока вы задаете ненулевое значение, и если это только одно поле с классом B. Если вы не можете полагаться на эту роскошь, вы должны указать имя поля и придать null типу, который вы хотите установить. В этом случае вам нужно написать что-то вроде этого:

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

Ответ 2

Попробуйте следующее:

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

Не работайте с примитивами и примитивами.

Ответ 3

Вы просто выполните:

Whitebox.setInternalState(Foo.class, b);

где b - это экземпляр B, который вы хотите установить.

Ответ 4

Вы можете использовать getAllStaticFields и попытаться установить их

Пример:

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