Junit : changer la valeur d’un champ ‘private final’ en toute impunité

Si dans une classe A, vous avez un champ private final String foo,
et que dans une classe TestA, vous cherchez à la changer après avoir fait un new, normalement c’est impossible…

Normalement, parce qu’il existe toujours une astuce pour contourner cela :

A Ainstance = new A ();
String newValue = "New value here !"
try {
Field fooField = A.class.getDeclaredField("foo");
fooField.setAccessible(true);//ignore private here
Field fieldModifiers = Field.class.getDeclaredField("modifiers");
fieldModifiers.setAccessible(true);
//Remove private and final here
fieldModifiers.setInt(fooField, fooField.getModifiers() & ~Modifier.FINAL & ~Modifier.PRIVATE);
fooField.set(Ainstance, newValue);
} catch (NoSuchFieldException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}

Une autre possibilité est de toujours passer par les getters pour récupérer la valeur d’un champ et de mocker la méthode getFoo (soit par une sous-classe si A n’est pas final, soit avec un framework genre Mockito)