java - Cómo simular una variable final estática usando JUnit, EasyMock o PowerMock
unit-testing (2)
Quiero simular una variable final estática y simular una clase i18n con JUnit, EasyMock o PowerMock. ¿Cómo puedo hacer eso?
Se puede hacer usando una combinación de características de PowerMock. @PrepareForTest({...})
estática usando la @PrepareForTest({...})
, burlándose de tu campo (estoy usando Mockito.mock(...)
, pero podrías usar la construcción EasyMock equivalente) y luego estableciendo tu valor usando WhiteBox.setInternalState(...)
método. Tenga en cuenta que esto funcionará incluso si su variable es private
.
Vea este enlace para ver un ejemplo extendido: http://codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension
¿Hay algo así como burlarse de una variable? Yo llamaría a eso reasignar. No creo que EasyMock o PowerMock le den una forma fácil de reasignar un campo static final
(parece un extraño caso de uso).
Si quiere hacer eso, probablemente haya algo mal con su diseño: evite las constantes static final
(o las constantes más comúnmente globales) si sabe que una variable puede tener otro valor, incluso para fines de prueba.
De todos modos, puede lograr eso utilizando la reflexión (desde: Uso de la reflexión para cambiar estática final File.separatorChar para la prueba de la unidad? ):
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
// remove final modifier from field
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
Úselo de la siguiente manera:
setFinalStatic(MyClass.class.getField("myField"), "newValue"); // For a String
No olvide restablecer el campo a su valor original al derribarlo.