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

问题描述 投票:1回答:1

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

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的填充是否被调用,但奇怪的是,调试器显示这个值为 "null",而没有NullPointerException。

用HashMap替换SparseArray解决了我的问题,但我很好奇,为什么SparseArray不能工作。

enter image description here

android junit4 android-sparsearray
1个回答
0
投票

虽然这个问题是3年前的问题,但它仍然是一个相关问题。

SparseArray (android.util.SparseArray)是Android SDK的一部分,而不是本地的JavaKotlin。不幸的是,这意味着它的行为不会像,例如,一个 Array. 相反,它的行为就像你的一个类。这意味着你必须对它进行mockfake才行。

一般来说,尽量避免使用静态字段,因为它们会增加测试的难度。如果你的值不是静态的,你可以注入一个提供者,它可以提供一个mockfake。

© www.soinside.com 2019 - 2024. All rights reserved.