如何编写单元测试以从java集中检索项目

时间:2011-09-06 07:22:35

标签: java unit-testing set

我已经实施了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());

这仅在将单个购物车项目添加到购物车时才有效。如果添加了两个或更多购物车项目,我将只能在使用某种比较器时退出商品。我有一种感觉,这不是正确的方法。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

测试集应该不是问题。

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

如果您不想测试整套,可以通过编程方式进行测试,也可以使用hamcrest matcherse.g. hasItem()/hasItems()/anyOf()/allOf()。我强烈建议使用hamcrest进行测试,因为测试更简洁,可读性更好,测试失败性更好。

答案 1 :(得分:1)

基本上有两种方法:

  • 使用确定性顺序将集合转换为列表,并测试列表中的所有项目是否为预期项目。你确实需要一个比较器。
  • 使用一些谓词并测试集合中的任何项是否满足谓词。通过其Predicate类及其Iterables.any方法,番石榴可能对此非常有用。

答案 2 :(得分:1)

听起来你的购物车做得非常多 - businesslogic和数据库的东西。如果您将问题分成不同的类,您的测试工作将变得更加容易。与数据库交谈的单元测试从来都不是一件好事。