Tengo un caso de prueba JUnit en un proyecto de Android que contiene código que se parece a esto:miembro de 'private static final' de Android prueba de unidad de valor cambios de clase para anular
private static final URI TEST_RESOURCE_URL = TasksService.TASKLIST_RESOURCELIST_URL.resolve("task/test.task");
public void setUp() {
Log.i("Test", "TEST_RESOURCE_URL=" + TEST_RESOURCE_URL);
}
Esta clase de prueba tiene múltiples métodos de prueba , algunos de los cuales se refieren (pero no intentan modificar) el valor de esta constante. Sin embargo, cuando corro estas pruebas (Android 2.2.2), todas estas pruebas, pero el primero falla, y Logcat me muestra esto:
03-03 18:56:41.791: I/Test(12008): TEST_RESOURCE_URL=http://apate.meridiandigital.net/tasks/task/test.task
03-03 18:56:42.101: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.131: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.151: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.281: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.311: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.341: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.361: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.391: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.391: I/Test(12008): TEST_RESOURCE_URL=null
¿Cómo funciona un valor de cambio de campo final estático como sigue? ¿Cómo evito que esto suceda? ¿Hay otras situaciones donde podría suceder?
--- EDIT 1
ahora han recortado el código abajo a un ejemplo más pequeño que se puede incluir en su totalidad. Ver más abajo:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
public class StaticFinalTest extends ServiceTestCase<MyService> {
public StaticFinalTest() {
super(MyService.class);
}
public static final Object CONST2 = new Object();
public void testA()
{
assertNotNull (CONST2);
}
public void testB()
{
assertNotNull (CONST2);
}
}
Cuando se ejecuta esta prueba, Testa pasa pero TESTB falla. Si testA está comentado, testB pasa.
Parece ser importante que sea una prueba de servicio. Un JUnit TestCase estándar no causa el problema. Si 'CONST2' es una cadena, ambas pruebas pasan como se esperaba. Cualquier otro tipo de referencia parece reproducir el problema.
¿Se podría descargar y volver a cargar la clase de prueba? ¿Puede Dalvik incluso hacer eso? ¿Tal vez tu constante está siendo ensombrecida por otra cosa? – nmr
No hay nada más del mismo nombre en ninguna parte del proyecto, así que no sospecho que se trata de un problema oculto. Sin embargo, creo que JUnit intenta volver a cargar clases entre ejecuciones de prueba utilizando un ClassLoader diferente para cada invocación. Entonces el campo * puede * ser una instancia diferente de la segunda ejecución en adelante.En cuyo caso, el problema es menos que haya cambiado, y más que el inicializador no se ejecutó por segunda vez. – Jules
No, JUnit no vuelve a cargar clases, solo vuelve a crear instancias de la clase antes de cada método. –