繁体   English   中英

如何从atg的ordertools组件检索订单或如何测试orderlookup Droplet API

[英]how to retrieve orders from ordertools component in atg or how to test orderlookup droplet api

我试图通过传递一些参数来订购Droplet API。我假设必须传递的参数是我已经传递的userId和organizationIds,此外我还传递了“ state”参数。所有这些参数都通过请求传递,然后通过服务方法传递的Droplet被调用。但是service方法什么也没有返回。我的目标是检查这个Droplet是否检索了预期的订单集。我们可以使用Droplet调用程序,但是我尝试过这种方法,但是它没用,可能是我错过了一些东西。请帮帮我!! 这是我尝试使用OrderLookUp API时的代码

DynamoHttpServletRequest request = ServletUtil.getCurrentRequest();

    mTestService.setCurrentRequest(request);
    if (request == null) {
        mTestService.vlogError("Request is null.");
        Assert.fail("Request is null ");
    }
    else
    {
        Object droplet = mTestService
                .getRequestScopedComponent("OrderLookupDroplet");

        OrderLookupDroplet=(OrderLookup) droplet;
        request.setParameter("state", "submitted");
        request.setParameter("organisationIds", organizationIds);
        request.setParameter("userId", userId);
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        DynamoHttpServletRequest dynRequest = (DynamoHttpServletRequest) request;
        TestingDynamoHttpServletRequest wrappedRequest = new TestingDynamoHttpServletRequest(
                dynRequest, buffer);
        TestingDynamoHttpServletResponse wrappedResponce = new TestingDynamoHttpServletResponse(
                dynRequest.getResponse());
         OrderLookupDroplet.service(wrappedRequest, wrappedResponce);
    }

上面的示例只是代码的一部分。

这是我尝试使用液滴调用程序时的代码

DropletInvoker invoker = new DropletInvoker(mNucleus);
        invoker.getRequest().setParameter("state", "submitted");
      //  String [] siteIds = {"siteA", "siteB"};
      //  invoker.getRequest().setParameter("siteIds", Arrays.asList(siteIds));
        String [] organizationIds = {"OrgA", "OrgB"};
        invoker.getRequest().setParameter("organizationIds", organizationIds);
        String [] orderIds = {"orderautouser001OrgA" , "orderautouser001OrgB"};
        invokeDroplet(invoker, "autouser001", orderIds);
......

protected void invokeDroplet(DropletInvoker pInvoker, String pUserId, String[] pOrderIds) throws Exception
  {
    Map<String, Object> localParams = new HashMap();
    localParams.put("userId", pUserId);
    DropletResult result = pInvoker.invokeDroplet("/atg/commerce/order/OrderLookup", localParams);
    RenderedOutputParameter oparam = result.getRenderedOutputParameter("output", 0);

    assertNotNull("'output' oparam was not rendered", oparam);

    assertEquals("Check totalCount.", pOrderIds.length, oparam.getFrameParameter("totalCount"));

    List<Order> orders = (List<Order>)oparam.getFrameParameter("result");
    assertEquals("Check order array length.", pOrderIds.length, orders.size());
    for (int index = 0; index < pOrderIds.length; index++) {
      boolean found = false;
      for (Order order: orders) {
        if (pOrderIds[index].equals(order.getId())) {
          found = true;
          break;
        }
      }
      assertTrue("Expected orderId " + pOrderIds[index] + " not found in result array", found);
    }

在第一种情况下,我不知道如何直接使用orderlookup api来检索订单。...在第二种情况下,尽管我知道如何使用它,但仍然失败! 请帮助我..提前谢谢

您不应在Java类中使用小滴,而应仅在jsp页面内使用小滴。 OrderLookup的文档以及在jsp页面上可以使用的示例示例在此处

如果要获取订单或存储在存储库中的任何其他数据,则应将存储库API与RQL(存储库查询语言)一起使用。 例如如何从库中,你可以找到的数据在这里和RQL语法在这里

感谢您提供意见。好消息是我们可以从任何其他API调用Droplet

OrderLookup droplet = (OrderLookup) sNucleus.resolveName("/atg/commerce/order/OrderLookup");
        ServletTestUtils utils = new ServletTestUtils();
        mRequest = utils.createDynamoHttpServletRequestForSession(sNucleus, null, null);
        ServletUtil.setCurrentRequest(mRequest);
        mResponse = new DynamoHttpServletResponse();
        mRequest.setResponse(mResponse);
        mResponse.setRequest(mRequest);
        mResponse.setResponse(new GenericHttpServletResponse());
        mRequest.setParameter("userId", "publishing");

        droplet.setSearchByUserId(true);
        droplet.service(mRequest, mResponse);
        ArrayList<Order> orders = (ArrayList<Order>) mRequest.getObjectParameter("result");

在这里,“结果”参数是该Droplet设置的输出参数。我已将用户ID硬编码为我创建的“发布”。忽略我创建的servletTestUtils类,它与此处的Droplet理论关系不大:)

我假设从您的代码示例中,以及您提到DropletInvoker的事实,您正在编写单元测试,而这不是功能代码。

如果是功能性的代码,你真的, 真的 ,不应该调用从另一个髓核组分液滴。 小滴仅存在于JSP页面中。 如果需要Java代码中小滴的功能,则应将小滴重构为包含主要逻辑的服务,并将小滴仅充当服务的外观,以允许从页面中调用它。

对于OrderLookup外观滴,您不需要重构任何东西。 根据需要,要使用的服务应该是OrderManagerOrderTools 请注意,Order对象和Order存储库项目之间有区别,您应该首选使用Order对象-因此,如果确实需要,请仅直接使用Order Repository。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM