在Android中的Enum中使用静态最终SparseArray字段的JUnit4的奇怪行为

时间:2017-04-13 21:16:23

标签: android junit4 android-sparsearray

在使用JUnit4进行测试时,我观察到SparseArray的奇怪行为被定义为Enum的静态最终字段。枚举类:

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)时,此方法返回null。我还使用调试器来检查是否调用了BY_VALUE的填充,但奇怪的是,调试器在没有NullPointerException的情况下将此值显示为“null”。

HashMap替换SparseArray修复了我的问题,但我很好奇,为什么SparseArray无效。

enter image description here

1 个答案:

答案 0 :(得分:0)

这个问题已经3岁了,但仍然是一个相关问题。

SparseArrayandroid.util.SparseArray)是Android SDK的一部分,而不是本机Java / Kotlin。不幸的是,这意味着它的行为不会像Array那样。相反,它的行为就像您的类之一。这意味着您必须对其进行模拟/伪造才能使用。

通常,请尝试避免使用静态字段,因为它们会使测试更加困难。如果您的价值不是一成不变的,那么您可以注入一个提供模拟/伪造的提供程序。