将项目添加到购物车时,playframework中的function测试失败

我写了一个function测试来检查将商品添加到购物车。对于能够将商品添加到购物车的用户,他需要登录。所以,我创建了一个登录用户的方法和另一种添加商品的方法。之前在测试中的addtocart方法之后,我正在检查购物车内容的大小。当我在开发模式下运行应用程序时,addtocartfunction没有任何问题(我也可以检查数据库 – 这是postgres而不是内存数据库)。addtocart在测试中失败了。

将项目添加到购物车的控制器方法

public static void addItemToCart(Long productId,Long cartId,String quantity) { Product product = Product.findById(productId); ShopCart cart = ShopCart.findById(cartId); int qty = Integer.parseInt(quantity); CartItem cartItem = new CartItem(product,qty); cart.addItem(cartItem); cart.save(); System.out.println("Controller::addItemToCart()::cart id="+cart.id+" has="+cart.cartItems.size()+" items); } 

我的测试方法是

  @Test public void testUserCanAddItemsToCart() { Fixtures.loadModels("data.yml"); User user = User.find("byEmail","user@shop.com").first(); loginAsCustomer("user@shop.com","userpass"); ShopCart usercart = new ShopCart(user); usercart.save(); System.out.println("BEFORE ADD::usercart="+usercart.id+" has :"+usercart.cartItems.size()+" items"); assertTrue(usercart.cartItems.size()==0); addItemsToCart(usercart); System.out.println("AFTER ADD::usercart="+usercart.id+" has :"+usercart.cartItems.size()+" items"); assertFalse(usercart.cartItems.size()==0);//why does this fail? } private Response addItemsToCart(ShopCart cart) { Product pdt = Product.find("byIsbn","654-0451160522").first(); assertNotNull(pdt); System.out.println("addItemsToCart():BEFORE ADD cart="+cart.id+" has="+cart.cartItems.size()); Map addtocartParams = new HashMap(); addtocartParams.put("cartId", cart.id.toString()); addtocartParams.put("quantity", "2"); String addtocarturl = "/items/addtocart/"+pdt.id.toString(); Response response = POST(addtocarturl,addtocartParams); System.out.println("addItemsToCart():AFTER ADD cart="+cart.id+" has="+cart.cartItems.size()); return response; } 

我得到的控制台输出是

 BEFORE ADD::usercart=48 has :0 items addItemsToCart():BEFORE ADD cart=48 has=0 Controller::addItemToCart()::cart id=48 has=1 items addItemsToCart():AFTER ADD cart=48 has=0 AFTER ADD::usercart=48 has :0 items 

这里,在控制器方法中,购物车实例(id = 48)在测试方法中保存到db.But后有1个项目,同一个id的购物车实例有0个内容。

我注释掉assertFalse方法,并使用cartId.Even从db检索购物车,然后同一ID的购物车有0个内容。我无法理解为什么会发生这种情况。任何人都可以解决这个问题?

//测试方法体..修改

 ShopCart cart = ShopCart.findById(usercart.id); System.out.println("AFTER ADD::cart="+cart.id+" has :"+cart.cartItems.size()+" items"); assertFalse(cart.cartItems.size()==0);//why does this fail? 

它失败是因为测试方法使用的购物车实例和addItemToCart方法使用的购物车实例不同。 每个事务都有自己的实体实例。 当某个其他事务更新此实体映射的行时,JPA不会自动刷新实体。

在调用addItemsToCart之后,您应该从数据库重新加载购物车,以检查是否已将某些内容添加到数据库中的购物车中。

我是面向对象思维的奴隶,所以我想知道的是,您是否考虑过将addItemsToCart()作为ShopCart类的一种方法? 我想象的是:

 ... ShopCart usercart = new ShopCart(user); usercart.addItemsToCart(pdt); usercart.save(); String addtocarturl = "/items/addtocart/"+pdt.id.toString(); Response response = POST(addtocarturl,addtocartParams); return response; 

我更容易考虑制作(或检索) ShopCart对象,修改它并将其放入数据库中。 这就是我如何避免这种情况。

我遇到了同样的问题,并且在我从数据库中获取模型之前在我的测试中添加了JPA.em()。clear()解决了这个问题。