2011-09-06 45 views
1

我已经实施了ShoppingCart,其中CartItem被放在Set中以避免重复的项目。我想测试把物品放入购物车并坚持数据库,然后从购物车检索物品并检查它们是否相同。如何编写单元测试以检索来自java的项目设置

我试图做到这一点,但它看起来很丑。它只能用于单个项目。如果使用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()); 

如果单个车项目被添加到cart.If两个或两个以上cartItems加入这只会工作,我将只能够当一些人retireve项目使用一种比较器。我有一种感觉,这是不正确的做法。

有什么建议吗?

回答

3

测试集不应该是一个问题。

如果您想测试您的完整集合,请创建一个相等的集合并在两个集合上使用equals()方法。确保集合中的元素也实现了equals()。

如果您不想测试完整集,可以通过编程方式访问它,也可以使用hamcrest matchers,e.g. hasItem()/hasItems()/anyOf()/allOf()。由于更简洁的测试,更好的可读性测试和更好的可读性测试失败,我强烈建议hamcrest进行测试。

1

基本上有这样做的方法有两种:

  • 改造成集列表使用确定的顺序,测试,如果列表中的所有项目都是预期的项目。你确实需要一个比较器。
  • 使用一些谓词并测试集合中的任何项目是否满足谓词。番石榴可能在这里有用,它的Predicate类和它的Iterables.any方法。
1

听起来像你的购物车正在做很多 - 商业逻辑和数据库的东西。如果您将担忧分为不同的类别,您的测试工作将变得更加容易。单元测试与数据库交谈永远不会是件好事。

相关问题