【问题标题】:Adding to an object ArrayList from another Class从另一个类添加到对象 ArrayList
【发布时间】:2019-01-29 09:17:04
【问题描述】:

我有一个名为 Item 的类。

public class Item {

private int code;
private String name;
private double price;
private int quantity;

public Item(int code, String name, double price, int quantity) {
    setCode(code);
    setName(name);
    setPrice(price);
    setQuantity(quantity);
}
//Item getters and setters

我有一个名为 Stock 的类,它创建一个项目的 ArrayList。

public class Stock {
private ArrayList<Item> stock;

public Stock() {
    stock = new ArrayList<Item>();
}

public ArrayList<Item> getStock() {
    return stock;
}

我还有一个名为 ItemRegister 的类,用于向 Stock 添加一个项目。

public class ItemRegister extends Stock {

public void registerItem(String name, double price) {
    getStock().add(new Item(setItemCode(), name, price, 0));
}

private int setItemCode() {
    return getStock().size() + 1;
}

我正在使用单元测试来查看我是否确实向 Stock 中添加了一个项目。

public class ItemRegisterTest {

@Test
public void testIfHasRegisteredItemInStock() {
    Stock s = new Stock();
    assertTrue(s.getStock().size() == 0);
    ItemRegister i = new ItemRegister();        
    i.registerItem("Oleo", 20.0);
    assertTrue(s.getStock().size() == 1);
}

}

当我运行这些测试时,它返回一个错误。 在第二个assertTrue,如果我使用对象i 进行测试,它将返回true,但我想要添加到Stock 而不是ItemRegister,因为如果稍后我想咨询Stock 我会打电话给Stock 而不是ItemRegister

【问题讨论】:

  • 您认为您的s 对象与您的i 对象有任何关系吗?为什么或为什么不?
  • 只检查 i 而不是 s:assertTrue(i.getStock().size() == 1);
  • @SotiriosDelimanolis 不是真的。因为我正在实例化一个新对象
  • s 更改为i 就像这样 assertTrue(i.getStock().size() == 1); s 有零个元素。
  • 嗨 @SergeiSirik 稍后我想尝试做一个销售课程,我想从 Stock 咨询,但它没有添加我想要的方式

标签: java arraylist junit4


【解决方案1】:

在 cmets 中,您可以做的可能是更改父子关系并让 ItemRegister 持有 Stock 对象的实例。因此,您可以像这样修改 ItemRegister 类:

public class ItemRegister  {
    Stock s;
    public ItemRegister(Stock s) {
        this.s = s;
    }

    public void registerItem(String name, double price) {
        s.getStock().add(new Item(setItemCode(), name, price, 0));
    }

    private int setItemCode() {
        return s.getStock().size() + 1;
    }
}

然后,您最初编写的测试代码将在 ItemRegister i = new ItemRegister(s); 稍作修改后为真,并且您可以处理 Stock 对象的一个​​实例。

【讨论】:

    【解决方案2】:

    我想添加到Stock 而不是ItemRegister,因为如果以后我想咨询Stock 我会打电话给Stock 而不是ItemRegister

    然后你需要将Stock 包装成ItemRegister

    public class ItemRegister  {
        Stock stock;
        public ItemRegister(Stock stock) {
            this.stock = stock;
        }
    
        public void registerItem(String name, double price) {
            stock.getStock().add(new Item(setItemCode(), name, price, 0));
        }
    
        private int setItemCode() {
            return stock.getStock().size() + 1;
        }
    }
    

    像这样在你的单元测试中使用它:

    public class ItemRegisterTest {
        @Test
        public void testIfHasRegisteredItemInStock() {
            Stock s = new Stock();
            assertTrue(s.getStock().size() == 0);
            ItemRegister i = new ItemRegister(s);        
            i.registerItem("Oleo", 20.0);
            assertTrue(s.getStock().size() == 1);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-07
      • 2021-12-20
      • 1970-01-01
      • 2015-07-12
      • 2017-05-27
      • 2017-12-20
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多