java - 将商品添加到购物车时,playframework 中的功能测试失败

标签 java testing playframework

我编写了一个功能测试来检查将商品添加到购物车。为了使用户能够将商品添加到购物车,他需要登录。因此,我创建了一个方法来登录用户,并创建了另一个方法来添加item.在测试中的 addtocart 方法之前和之后,我正在检查购物车内容的大小。当我在开发模式下运行应用程序时,addtocart 功能可以正常工作(我也可以检查数据库 - 这是 postgres 而不是在内存数据库中)。addtocart 测试失败。

将商品添加到购物车的 Controller 方法

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","<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="097c7a6c7b497a616679276a6664" rel="noreferrer noopener nofollow">[email protected]</a>").first();
    loginAsCustomer("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0d787e687f4d7e65627d236e6260" rel="noreferrer noopener nofollow">[email protected]</a>","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

这里,在 Controller 方法中,购物车实例(id=48)保存到数据库后有 1 个商品。但在测试方法中,相同 id 的购物车实例有 0 个内容。

我注释掉了assertFalse方法并使用cartId从数据库检索了购物车。即使如此,相同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 后,您应该从数据库重新加载购物车,以检查数据库中的购物车是否已添加某些内容。

关于java - 将商品添加到购物车时,playframework 中的功能测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7593802/

相关文章:

java - H2内存数据库初始化数据

java - spring mvc项目中的org.springframework.beans.factory.BeanCreationException

Javac 无法在具有公共(public)枚举的静态嵌套类上编译注释

c# - Mock 测试时找不到合约名称。

java - 如何使用 guice 注入(inject)来模拟 play 框架中的身份 validator ?

java - 如何在play框架中忽略要编译的文件夹

java - 在 Android 中清除 Glide 图像缓存

javascript - ember 集成测试错误。处理异步副作用

java - PhantomJS 和 Selenium Webdriver - 如何清除 session

scala - Akka 和 Play on Heroku : Should I have my actors on seperate dyno or in the web dyno?