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会继续用于其他测试。
枚举值首先不应是可变的。从Oracle教程(已添加重点):
枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。
如果要与枚举键关联的可变值,请使用Map。您可以使用任何类型的Map(例如HashMap,TreeMap),但是由于键是Enum,所以最佳选择是EnumMap:
EnumMap<SnackType, Integer> quantities = new EnumMap<>(SnackType.class);
Run Code Online (Sandbox Code Playgroud)