Я пытаюсь протестировать следующий класс, который вызывает один синглтон, который инициализирует приватную статическую конечную переменную, издеваясь над ней, следуя примеру this.Что я делаю неправильно, высмеивая эту приватную статическую конечную переменную, используя mockito и reflection?
Вот что я делаю
public class ClassToTest {
private static final boolean CONF_FLAG = Configuration.getConfig()
.get(Status.Initialization).getConfFlag(); // throws an NPE
public methodToTest(TestObject a){
...
}
}
где положение является Enum.
Класс испытаний:
public class TestClassToTest{
TestObject a;
ClassToTest t;
@Before
public void setUp() throws Exception {
setFinalStatic(ClassToTest.class.getDeclaredField("CONF_FLAG"), true);// this fails!
a = mock(TestObject.class);
t = new ClassToTest();
}
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
}
Я не забочусь о стоимости CONF_FLAG
, но не могу показаться, чтобы дразнить его. Что я делаю не так?
+1. Чтобы добавить сюда, если вызов происходит как часть инициализации статического поля, у вас будет мало контроля за временем вызова, и у него фактически не будет возможности заменить его на тесты. Как правило, если вызов достаточно опасен, чтобы, возможно, выбросить исключение или заставить насмехаться в тестах, вы не хотите его в каком-либо статическом инициализаторе. –
@Jeff Bowman, @ ck1 Да, я полностью понимаю, что не ставить его в статическом инициализаторе, но это часть устаревшего кода, с которым мне ударили, и я вроде как пытаюсь поработать вокруг него. Предполагая, что 'getConfig()' является статическим методом .. есть ли способ, который я могу издеваться/заглушить весь вызов в singleton? Если да, Id очень ценит некоторый код/псевдокод. – MuleNoob