2012-11-23 91 views
5

我有一个类从ServiceTestCase延伸到测试我的Android服务实现。静态最终常量变为空

public class MainCoreServiceTest extends ServiceTestCase<CoreService> { 

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

    // More code 
} 

我现在面临的问题是,如果我只运行一个测试方法,一切都很好,但如果我发动全班同学(其中包含几个测试方法),然后在第二个测试方法,我得到一个ExceptionInInitializerError和我发现这是因为DB_PATH为空。这是发生这种情况的方法:

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)DB_PATH为空

我不修改显然未能这种不断的任何地方(无论如何,因为这是最后我不能修改的话),所以我不不理解这种行为。

如果我将这个常量移动到另一个类/接口,它工作正常。

任何人都可以请解释这种行为?提前致谢!

+0

'wipeOutDB()'会失败,并'NullPointerException'文件构造函数中。也许你有[static static dependency](http://stackoverflow.com/questions/6416408/static-circular-dependency-in-java)导致[在静态初始化程序中出现意外的异常](http:// docs .oracle.com/javase/6/docs/api/java/lang/ExceptionInInitializerError.html) – zapl

+0

是的,它确实与NPE失败,但为什么只在第二次测试?没有意义... – m0skit0

回答

2

你得到的异常意味着,DB_PATH无法初始化 - 因此它后面是null。我想你用来初始化DB_PATH的一个部分是空的,可能在这个地方:CoreService.class.getPackage().getName()

另见:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ExceptionInInitializerError.html

+0

怎么能'CoreService.class.getPackage()。getName()'有什么空? AFAIK这是完全静态的信息。它在第一次测试中起作用... – m0skit0