ActivityInstrumentationTestCase2和静态韵母的使用:字段在第一次测试后变为null

时间:2011-07-09 11:08:26

标签: android unit-testing static android-activity junit

这看起来真的很神奇,我很想知道为什么会这样:)

这是我的单元测试:

public class SelectThemeActivityTest 
    extends ActivityInstrumentationTestCase2<SelectThemeActivity> {

    private final static int[] STATIC_ARRAY = { 0, 1, 2 };

    public SelectThemeActivityTest() {
        super("com.the7art.simplewallpaper", SelectThemeActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        // some array usage here - will throw NullPointerEcxeption on second test
        // see description below
        STATIC_ARRAY[0] = 2;
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testFirst() {

    }
    public void testSecond() {

    }
    public void testThird() {

    }
}

如果我运行此测试用例第一次测试成功完成,其余所有操作都会失败,方法是从 setUp()中抛出 NullPointerException - 该行它试图访问STATIC_ARRAY。

更令我困惑的是,如果我更改测试用例以扩展 AndroidTestCase 而不是 ActivityInstrumentationTestCase2 ,那么所有测试成功完成!魔法! : - )

此外,如果我从STATIC_ARRAY中删除'static'关键字,测试也会成功。

所以很明显,某些东西正在通过在测试运行之间使其为空来修改我的STATIC_ARRAY,很可能是在 tearDown()中,而某些东西有关> ActivityInstrumentationTestCase2 ,但如何跟踪某事? :-)任何想法?

2 个答案:

答案 0 :(得分:3)

原因是从super.tearDown():google-groups discussion调用的scrubClass()方法。解决方案是 - overriding this method

答案 1 :(得分:1)

在STATIC_ARRAY上放置一个观察点并看看谁修改它,虽然没有太多的候选人(因为该字段是私有的,几乎只有一个候选人,你刚刚发布的课程,所以图片中缺少一些东西