Ich versuche, die folgende Klasse zu testen, die zu einem Singleton aufruft, der eine private statische Endvariable initialisiert, indem es es mockt, folgend this Beispiel.Was mache ich falsch falsch diese private statische letzte Variable mit Mockito und Reflexion?
Hier ist, was ich tue
public class ClassToTest {
private static final boolean CONF_FLAG = Configuration.getConfig()
.get(Status.Initialization).getConfFlag(); // throws an NPE
public methodToTest(TestObject a){
...
}
}
wo Stand ein Enum ist.
Prüfklasse:
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);
}
}
Ich interessiere mich nicht für den Wert von CONF_FLAG
aber kann nicht scheinen, um es zu verspotten. Was mache ich falsch?
+1. Um hier hinzuzufügen, solange der Aufruf als Teil der statischen Feldinitialisierung erfolgt, haben Sie wenig Kontrolle über den Zeitpunkt des Aufrufs und haben praktisch keine Gelegenheit, ihn für Tests zu ersetzen. Als Faustregel gilt: Wenn ein Aufruf gefährlich genug ist, um möglicherweise eine Ausnahme auszulösen oder in Tests zu spotten, möchten Sie das nicht in einem statischen Initialisierer. –
@Jeff Bowman, @ ck1 Ja, ich verstehe den Teil, der es nicht in den statischen Initialisierer legt, aber das ist ein Stück Legacy-Code, mit dem ich geschlagen wurde und ich versuche irgendwie, mich damit herumzuarbeiten 'getConfig()' ist eine statische Methode. Gibt es irgendeine Möglichkeit, den gesamten Aufruf an den Singleton zu übertragen? Wenn ja, würde ich Code/Pseudocode sehr schätzen. – MuleNoob