Тестирование PowerMock - установить статическое поле класса
Мне трудно найти способ установить статическое поле класса. Это в основном так:
public class Foo{
// ...
private static B b = null;
}
где B - другой класс.
Есть ли способ сделать это в PowerMock, кроме как с setInternalStateFromContext()
? Использование метода класса контекста кажется немного излишним для установки одного поля.
Спасибо.
Ответы
Ответ 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);
} }