我写了一个功能测试来检查将商品添加到购物车。对于能够将商品添加到购物车的用户,他需要登录。所以,我创建了一种方法来登录用户,另一种方法是添加在测试中的addtocart方法之前和之后,我正在检查购物车内容的大小。当我在开发模式下运行应用程序时,addtocart功能没有任何问题(我也可以检查数据库 - 这是postgres而不是在内存db)。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<String,String> addtocartParams = new HashMap<String,String>();
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个内容。我无法理解为什么会发生这种情况。有人能解决这个问题吗?
// test method body ..modified
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?
答案 0 :(得分:3)
它失败,因为您的测试方法使用的购物车实例和addItemToCart
方法使用的购物车实例不同。每个事务都有自己的实体实例。当某个其他事务更新此实体映射的行时,JPA不会自动刷新实体。
在调用addItemsToCart
后,您应该从数据库重新加载购物车,以检查是否已将某些内容添加到数据库中的购物车。
答案 1 :(得分:0)
我是面向对象思维的奴隶,所以我想知道的是,你有没有想过让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
对象,修改它并将其放入数据库中。这就是我如何避免这种情况。
答案 2 :(得分:0)
我遇到了同样的问题,并且在我从数据库中获取模型之前在我的测试中添加了JPA.em()。clear()解决了这个问题。