我正在测试一个静态实用程序类的方法:
@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环境中完成的
答案 0 :(得分:0)
好的,发现每当在测试的方法中使用像SparseArray或ContentValues这样的android框架类时,你必须在模拟器或设备上运行测试作为检测单元测试(androidTest),否则这些对象不会被初始化他们应该
答案 1 :(得分:0)
因此,在这种情况下,您需要静态地图对象,但在其他情况下,您正在单元测试的方法不需要静态初始化的 SparseArray 等,这是避免进行插桩测试并将其保持为另一种方法纯单元测试,在这个 tools.android.com page 中建议,即:
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}