2012-03-14 26 views

Respuesta

36

¿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 desea hacer eso, probablemente haya algún problema con su diseño: evite static final (o constantes globales más comunes) si sabe que una variable puede tener otro valor, incluso para fines de prueba.

De todas formas, se puede lograr que el uso de la reflexión (a partir de: Using reflection to change static final File.separatorChar for unit testing?):

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); 
} 

Se usa de la siguiente manera:

setFinalStatic(MyClass.class.getField("myField"), "newValue"); // For a String 

No se olvide de restablecer el campo a su valor original cuando derribando.

+4

Cualquiera que use esto debe tener en cuenta que el compilador de java puede incluir constantes en línea y, por lo tanto, el código puede no tener acceso a otros campos finales (debería funcionar para File.separatorChar porque la constante sería inútil cuando está en línea). Esto se describe en [esta pregunta] (http://stackoverflow.com/questions/5173372/java-static-final-values-replaced-in-code-when-compiling) –

+0

Si sé que la variable solo tiene otro valor durante pruebas unitarias, ¿cuál sería el enfoque sugerido? – Sharif

5

Se puede hacer usando una combinación de características de PowerMock. La burla estática usando la anotación @PrepareForTest({...}), burlándose de su campo (estoy usando Mockito.mock(...), pero podría usar la construcción equivalente de EasyMock) y luego estableciendo su valor usando el método WhiteBox.setInternalState(...). Tenga en cuenta que esto funcionará incluso si su variable es private.

Vea este enlace para un ejemplo extendido: http://codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension

+1

Nota: el "enlace para un ejemplo extendido" se refiere a burlarse de un campo ** estático **, no un campo ** estático final como se menciona en la pregunta. –

-1

https://github.com/zhangyanwei/staticmock

  1. StaticMockito.enhanceClass ("xxx.Utility");
  2. StaticMockito.initMock (Utility.class);
  3. when (Utility.toClientId (clientName)). ThenReturn ("nombre"); verify (mocker (Utility.class)). ToClientId (clientName);
Cuestiones relacionadas