2012-11-23 20 views
5

Ho una classe che si estende da ServiceTestCase per testare l'implementazione del servizio Android.La costante statica finale diventa nulla

public class MainCoreServiceTest extends ServiceTestCase<CoreService> { 

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

    // More code 
} 

Il problema che sto affrontando è che se corro solo un metodo di prova, tutto va bene, ma se mi lancio a tutta la classe (che contiene diversi metodi di prova) e poi sul secondo metodo di prova ottengo un ExceptionInInitializerError e Ho scoperto che questo è dovuto al fatto che DB_PATH è nullo. Questo è il metodo in cui questo avviene:

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) fallisce ovviamente quando DB_PATH è nullo

Non modificare questo costante ovunque (comunque non modificabili perché è finale), così don capisco questo comportamento

Se sposto questa costante su un'altra classe/interfaccia, funziona correttamente.

Qualcuno può spiegare questo comportamento? Grazie in anticipo!

+0

'wipeOutDB()' sarebbe riuscire con un 'NullPointerException' all'interno del costruttore di file. Forse hai qualche [dipendenza statica circolare] (http://stackoverflow.com/questions/6416408/static-circular-dependency-in-java) che porta a [un'eccezione imprevista in un inizializzatore statico] (http: // docs .oracle.com/javase/6/docs/api/java/lang/ExceptionInInitializerError.html) – zapl

+0

Sì, fallisce con un NPE, ma perché solo su un secondo test? Non ha senso ... – m0skit0

risposta

2

L'eccezione ottenuta significa che DB_PATH non può essere inizializzato, quindi è null in seguito. Immagino che una delle parti che usi per avviare DB_PATH sia nullo, probabilmente da qualche parte in questo: CoreService.class.getPackage().getName().

Vedi anche: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ExceptionInInitializerError.html

+0

In che modo 'CoreService.class.getPackage(). GetName()' ha nulla di nulla? AFAIK questa è una informazione completamente statica. E funziona al primo test ... – m0skit0

Problemi correlati