【问题标题】:Reinitialize Enum values for every Unit Test in Java为 Java 中的每个单元测试重新初始化枚举值
【发布时间】:2019-08-06 09:20:46
【问题描述】:

我为自动售货机编写了 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;
    }

}

这是我的一些测试示例

 @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);
        }

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();

    }

我知道口香糖的数量会在本次测试结束时变为 0,然后测试将失败,但我不希望 0 延续到其他测试。

【问题讨论】:

    标签: java class enums initialization


    【解决方案1】:

    枚举值一开始就不应该是可变的。来自the Oracle tutorial(强调):

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

    如果您想要一个与枚举键关联的可变值,请使用Map。你可以使用任何类型的Map(例如HashMapTreeMap),但是因为密钥是Enum,所以最好的选择是EnumMap

    EnumMap<SnackType, Integer> quantities = new EnumMap<>(SnackType.class);
    

    【讨论】:

    • 我做了一些事情,我给每台机器自己的 SnackTypes 实例public class SnackMachine { public static int DEFAULT_QUANTITY = 20; public Money money_inside = new Money(BigDecimal.valueOf(0.0)); public Money CUSTOMERS_MONEY = new Money(BigDecimal.valueOf(0.0)); public SnackType chewing = SnackType.CHEWING_GUM; public SnackType chips = SnackType.CHIPS; public SnackType chocolate = SnackType.CHOCOLATE; 这应该解决问题吗?但是我遇到了同样的问题
    • @DuniaAlrabadi 不要将此类信息放入 cmets。如果需要,请更新您的问题。
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多