在junit测试期间,静态初始化程序似乎不会运行

时间:2016-05-24 16:06:40

标签: java android junit junit4

我正在测试一个静态实用程序类的方法:

@Test
public void createGenreString()
{
    //Arrange
    String expected1 = "Action, Adventure, Animation, 

    //Act
    String actual1 = Utils.createGenreString(new int[]{28, 12, 16, 35});

    //Assert
    assertThat(actual1, is(equalTo(expected1)));
}

这个静态方法正在访问一种静态地图对象(MovieDbContract.GENRES),它使用整数键检索String值:

public static String createGenreString(int[] genreIds)
{
    StringBuilder sb = new StringBuilder();
    int length = genreIds.length;
    for (int i = 0; i < length && genreIds[i] != 0; i++)
    {
        if (i != 0) sb.append(", ");
        String genre = MovieDbContract.GENRES.get(genreIds[i]);
        sb.append(genre != null ? genre : "Unknown");
    }
    return sb.toString();
}

这个静态地图对象应该通过静态初始化程序填充数据:

public static final SparseArray<String> GENRES = new SparseArray<>();

static
{
    GENRES.put(28, "Action");
    GENRES.put(12, "Adventure");
    GENRES.put(16, "Animation");
    .
    .
}

现在的问题是,当测试运行时,map对象为null,它没有填充数据,因此测试失败。但程序本身工作正常,包含数据。任何人都知道为什么在测试期间这是不同的?我正在使用JUnit 4.12,这一切都是在Android环境中完成的

2 个答案:

答案 0 :(得分:0)

好的,发现每当在测试的方法中使用像SparseArray或ContentValues这样的android框架类时,你必须在模拟器或设备上运行测试作为检测单元测试(androidTest),否则这些对象不会被初始化他们应该

答案 1 :(得分:0)

因此,在这种情况下,您需要静态地图对象,但在其他情况下,您正在单元测试的方法不需要静态初始化的 SparseArray 等,这是避免进行插桩测试并将其保持为另一种方法纯单元测试,在这个 tools.android.com page 中建议,即:

android {
  // ...
  testOptions { 
     unitTests.returnDefaultValues = true
  }
}