我有一个实现另一个超类的接口测试类。在测试类中,我有一个方法应该检索ArrayList中的所有对象。首先,它检查它是否为空。如果没有,它应该返回整个列表。这就是我的尝试。
public class ProductDBImpl implements ProductDB {
// field declarations
ArrayList<Product> products = new ArrayList<Product>();
@Override
public List<Product> getAllProducts()
{
// TODO Auto-generated method stub
// TODO Auto-generated method stub
// create an iterator for the Arraylist
if (products.isEmpty())
{
return new ArrayList<Product>() ;
}
return products;
}
不幸的是,当我运行我的测试脚本(测试接口测试类和超类)时,getAllProducts()方法不能正常工作,它返回productdb.util.AssertionFailedError: expected:<1> but was:<0>
消息。以下是测试脚本测试getAllProducts()方法的方法:
// testing getAllProducts()
List<Product> productList = productDB.getAllProducts();
int size = productList.size();
productList.remove(0);
productList = productDB.getAllProducts();
Assert.assertEquals(size, productList.size());
请帮我识别我的错误。谢谢。
答案 0 :(得分:2)
返回对ArrayList对象的引用。然后修改对象。然后你得到另一个引用并发现该对象已被修改。
如果要保护数据结构不受外部修改,请返回新的List或UnmodifiableList:
@Override
public List<Product> getAllProducts()
{
return new ArrayList<>(products);
}
或者,为了避免额外的内存分配和副本(请注意,这将导致对测试代码中的.remove()调用失败;重要的是你是否必须允许调用者修改他们收到的列表) :
@Override
public List<Product> getAllProducts()
{
return Collections.unmodifiableList(products);
}