2012-11-23 11 views
5

Mam klasę, która rozciąga się od ServiceTestCase, aby przetestować moją implementację usługi Android.Stała końcowa stała się pusta

public class MainCoreServiceTest extends ServiceTestCase<CoreService> { 

    protected static final String DB_PATH = "/data/data/" 
      + CoreService.class.getPackage().getName() + "/databases/" 
      + DatabaseManager.DB_NAME; 

    // More code 
} 

Problem jestem stoi to, że jeśli mogę uruchomić tylko jedną metodę badania, wszystko jest w porządku, ale jeśli uruchomić całą klasę (który zawiera kilka metod badawczych), a następnie na drugiej metodzie testowej Dostaję ExceptionInInitializerError i Dowiedziałem się, że to dlatego, że DB_PATH ma wartość null. Jest to metoda, w której to się dzieje:

private void wipeOutDB() { 

    // Erase DB file 
    File dbFile = new File(DB_PATH); 
    if (dbFile.exists()) { 
     assertTrue(dbFile.delete()); 
    } 

    // Erase journal file 
    dbFile = new File(DB_PATH + "-journal"); 
    if (dbFile.exists()) { 
     assertTrue(dbFile.delete()); 
    } 
} 

new File(DB_PATH) oczywiście nie powiedzie się, gdy DB_PATH jest null

nie modyfikować tę stałą wszędzie (w każdym razie nie mogę go zmodyfikować, ponieważ jest to wersja ostateczna), więc don nie rozumiem tego zachowania.

Po przeniesieniu tej stałej do innej klasy/interfejsu działa dobrze.

Czy ktoś może wyjaśnić to zachowanie? Z góry dziękuję!

+0

'wipeOutDB()' nie powiedzie się z 'NullPointerException' wewnątrz konstruktora pliku. Być może masz pewną [kołową zależność statyczną] (http://stackoverflow.com/questions/6416408/static-circular-dependency-in-java), która prowadzi do [nieoczekiwanego wyjątku w statycznym inicjalizatorze] (http: // docs .oracle.com/javase/6/docs/api/java/lang/ExceptionInInitializerError.html) – zapl

+0

Tak, to kończy się niepowodzeniem z NPE, ale dlaczego tylko na drugim teście? Nie ma sensu ... – m0skit0

Odpowiedz

2

Wyjątek, który otrzymujesz, oznacza, że ​​DB_PATH nie może zostać zainicjalizowany - w ten sposób później jest null. Domyślam się, że jedna z części użytych do zainicjowania DB_PATH ma wartość null, prawdopodobnie gdzieś w tym: CoreService.class.getPackage().getName().

zobacz także: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ExceptionInInitializerError.html

+0

W jaki sposób 'CoreService.class.getPackage(). GetName()' może mieć dowolne zero? AFAIK to w pełni statyczna informacja. I działa na pierwszym teście ... – m0skit0