为Java中的每个单元测试重新初始化Enum值

0 java enums initialization class

我为带有数量和价格的自动售货机编写了SnackType枚举类。我希望每次调用新测试时都要重新初始化数量。但是,我遇到的一个问题是,如果测试更改了数量的值,那么更改后的值将转入下一个测试。


public enum SnackType{
    CHIPS(20, 1), CHOCOLATE(20, 2), CHEWING_GUM(20, .5);
    int amount;
    final double price;
    SnackType(int quantity, double price)
    {
        this.amount = quantity;
        this.price = price;
    }

    public int quantity(){
        return this.amount;
    }
    public double getPrice(){
        return this.price;
    }
    public void subquantity()
    {
        this.amount -= 1;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我测试的一些例子

 @Test
    void buying_unavailable_quantity_of_a_snack_should_fail() {
        while (snackMachine.chewingGums().quantity() > 0) {
            snackMachine.insertMoney(Money.QUARTER_DINAR);
            snackMachine.insertMoney(Money.QUARTER_DINAR);

            snackMachine.buySnack(SnackType.CHEWING_GUM);
        }
Run Code Online (Sandbox Code Playgroud)

insertMoney()不用担心这个功能 buySnack()这个功能减去数量

Money buySnack(SnackType snack){
        if(snack.quantity()==0){
            throw new IllegalStateException("can't buy snack quantity zero");
        }
        else if (this.CUSTOMERS_MONEY.value.doubleValue() >= snack.getPrice()){
            snack.subquantity();

    }
Run Code Online (Sandbox Code Playgroud)

我知道在该测试结束时口香糖的数量将变为0,然后该测试将失败,但是我不希望0会继续用于其他测试。

And*_*ner 9

枚举值首先不应是可变的。从Oracle教程(已添加重点):

枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量

如果要与枚举键关联的可变值,请使用Map。您可以使用任何类型的Map(例如HashMapTreeMap),但是由于键是Enum,所以最佳选择是EnumMap

EnumMap<SnackType, Integer> quantities = new EnumMap<>(SnackType.class);
Run Code Online (Sandbox Code Playgroud)