我已经实施了ShoppingCart
,其中CartItem
被放入Set
以避免重复项目。我想测试将商品放入购物车并持久存储在数据库中,然后从购物车中检索商品并检查它们是否相同。
我试着这样做,但看起来很难看。它仅适用于单个项目。如果List
用于存储CartItems
,则问题就已解决。
class ShoppingCart{
private Set<CartItem> cartItems;
private User customer;
public ShoppingCart(User customer) {
super();
this.cartItems = new TreeSet<CartItem>();
this.customer = customer;
}
...
}
class CartItem{
private Product pdt;
private int quantity;
...
}
单元测试
User bob = getUserByName("bob");
CartItem citem1 = new CartItem(product1,3);
ShoppingCart cart = new ShoppingCart(bob);
cart.addItem(citem1);
cart.saveToDB();
ShoppingCart bobCart = getCartFromDbUsingCustomer(bob);
assertNotNull(bobCart);
Set<CartItem> bobCartItems = bobCart.getCartItems();
assertEquals(1,bobCartItems.size());
CartItem[] citems = bobCartItems.toArray(new CartItem[0]);
CartItem bobCartItem = citems[0];
assertEquals("978",bobCartItem.getProduct().getIsbn());
assertEquals(3,bobCartItem.getQuantity());
这仅在将单个购物车项目添加到购物车时才有效。如果添加了两个或更多购物车项目,我将只能在使用某种比较器时退出商品。我有一种感觉,这不是正确的方法。
有什么建议吗?
答案 0 :(得分:3)
测试集应该不是问题。
如果要测试完整集,请创建一个相等的集并在两个集上使用equals()方法。确保集合中的元素也实现equals()。
如果您不想测试整套,可以通过编程方式进行测试,也可以使用hamcrest matchers,e.g. hasItem()
/hasItems()
/anyOf()
/allOf()
。我强烈建议使用hamcrest进行测试,因为测试更简洁,可读性更好,测试失败性更好。
答案 1 :(得分:1)
基本上有两种方法:
Predicate
类及其Iterables.any
方法,番石榴可能对此非常有用。答案 2 :(得分:1)
听起来你的购物车做得非常多 - businesslogic和数据库的东西。如果您将问题分成不同的类,您的测试工作将变得更加容易。与数据库交谈的单元测试从来都不是一件好事。