Mam przypadek testowy JUnit w Android projektu, który zawiera kod, który wygląda tak:„private static final” członek Android testów jednostkowych wartość zmienia klasy null
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);
}
Ta klasa Test ma wiele metod testowych , z których niektóre odnoszą się do (ale nie próbuj modyfikować) wartości tej stałej. Jednak, kiedy uruchomić te testy (Android 2.2.2), wszystkie z tych badań, ale pierwszy z nich się nie powiedzie, a logcat mi pokazuje to:
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
Jak statyczną wartość końcowa zmiana pola w taki sposób? Jak temu zapobiec? Czy są inne sytuacje, w których może się to zdarzyć?
--- EDIT 1
I teraz przycięte kodu w dół w mniejszym przykładzie, że mogą być włączone w całości. Zobacz poniżej:
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);
}
}
Po uruchomieniu testu testA przechodzi, ale testB nie działa. Jeśli testA zostanie skomentowany, testB przechodzi.
Wydaje się ważne, że jest to ServiceTestCase. Standardowa JUnit TestCase nie powoduje problemu. Jeśli "CONST2" jest ciągiem, oba testy przebiegają zgodnie z oczekiwaniami. Każdy inny typ odniesienia wydaje się odtworzyć problem.
Czy istnieje możliwość wyładowania i ponownego załadowania klasy testowej? Czy Dalvik może to zrobić? Może twoja stała jest w cieniu przez coś innego? – nmr
W projekcie nie ma nic więcej o tej samej nazwie, więc nie podejrzewam, że jest to problem z cieniami. Myślę, że JUnit próbuje przeładować klasy między testami, używając innej klasy ClassLoader dla każdego wywołania. Zatem pole * może * być inną instancją od drugiego uruchomienia.W takim przypadku problem jest mniejszy, niż się zmienił, i więcej, że inicjator nie uruchomił się po raz drugi. – Jules
Nie, JUnit nie ładuje ponownie klas, tylko ponownie tworzy instancję klasy przed każdą metodą. –