android 中 Enum 中带有静态最终 SparseArray 字段的 JUnit4 的奇怪行为
Strange behavior of JUnit4 with static final SparseArray field in Enum in android
我在使用 JUnit4 进行测试时观察到 SparseArray 的奇怪行为被定义为 Enum 的静态最终字段。枚举 class:
public enum ConstantType {
PI(0, Math.PI),
E(1, Math.E),
;
private static final SparseArray<ConstantType> BY_VALUE = new SparseArray<>();
final int id;
final double value;
static {
for (ConstantType type : values()) {
BY_VALUE.append(type.id, type);
}
}
ConstantType(int id, double value) {
this.id = id;
this.value = value;
}
@Nullable
static ConstantType fromValue(int value) {
return BY_VALUE.get(value);
}
}
问题是当我访问方法 ConstantType.fromValue(0) 时,此方法 returns 始终为空。我还使用调试器检查是否调用了 BY_VALUE 的填充,但奇怪的是,调试器将此值显示为 "null" 而没有 NullPointerException.
用 HashMap 替换 SparseArray 解决了我的问题,但我很好奇,为什么 SparseArray 不起作用。
虽然这个问题已有 3 年历史,但它仍然是一个相关问题。
SparseArray
(android.util.SparseArray
) 是 Android SDK 的一部分,而不是本机 Java/Kotlin。不幸的是,这意味着它不会表现得像 Array
。相反,它会表现得像您的 类 之一。这意味着您必须 mock/fake 它才能工作。
一般来说,尽量避免使用静态字段,因为它们会使测试更加困难。如果您的值不是静态的,您可以注入一个可以提供 mock/fake.
的提供程序
我在使用 JUnit4 进行测试时观察到 SparseArray 的奇怪行为被定义为 Enum 的静态最终字段。枚举 class:
public enum ConstantType {
PI(0, Math.PI),
E(1, Math.E),
;
private static final SparseArray<ConstantType> BY_VALUE = new SparseArray<>();
final int id;
final double value;
static {
for (ConstantType type : values()) {
BY_VALUE.append(type.id, type);
}
}
ConstantType(int id, double value) {
this.id = id;
this.value = value;
}
@Nullable
static ConstantType fromValue(int value) {
return BY_VALUE.get(value);
}
}
问题是当我访问方法 ConstantType.fromValue(0) 时,此方法 returns 始终为空。我还使用调试器检查是否调用了 BY_VALUE 的填充,但奇怪的是,调试器将此值显示为 "null" 而没有 NullPointerException.
用 HashMap 替换 SparseArray 解决了我的问题,但我很好奇,为什么 SparseArray 不起作用。
虽然这个问题已有 3 年历史,但它仍然是一个相关问题。
SparseArray
(android.util.SparseArray
) 是 Android SDK 的一部分,而不是本机 Java/Kotlin。不幸的是,这意味着它不会表现得像 Array
。相反,它会表现得像您的 类 之一。这意味着您必须 mock/fake 它才能工作。
一般来说,尽量避免使用静态字段,因为它们会使测试更加困难。如果您的值不是静态的,您可以注入一个可以提供 mock/fake.
的提供程序