как получить заказы из компонента ordertools в atg или как протестировать API дроплета orderlookup

Я пытаюсь API дроплета порядка поиска, передавая некоторые параметры. Я предполагаю, что обязательными параметрами являются идентификатор пользователя и организация, которые я передал, и, кроме того, я также передал параметр «состояние». Все эти параметры передаются через запрос, а затем метод службы вызывается капля. Но метод службы ничего не возвращает. Моя цель - проверить, получает ли эта капля ожидаемый набор заказов или нет. Пожалуйста, помогите мне! это мой код, когда я пытался использовать API OrderLookUp

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);
    }

в первом случае я не знаю, как получить заказы, напрямую используя API-интерфейс orderlookup .... а во втором случае, хотя я знаю, как его использовать, я все еще терплю неудачу! пожалуйста, помогите мне .. спасибо заранее


person Mani manasa mylavarapu    schedule 15.03.2014    source источник


Ответы (3)


Вы не должны использовать дроплеты в классах Java, они должны использоваться только внутри страниц jsp. Документация OrderLookup с примером горячего использования на странице jsp: здесь.

Если вы хотите получить заказы или любые другие данные, хранящиеся в репозитории, вы должны использовать API репозитория с RQL (язык запросов репозитория). Пример получения данных из репозитория вы можете найти здесь и грамматику RQL здесь.

person hpruszyn    schedule 29.09.2014
comment
Это для целей тестирования. Как разработчик может гарантировать, что разработанная им капля ведет себя так, как ожидалось. Требование не получает данные здесь, я знаю, что есть другие способы сделать это с помощью RQL. В вопросе это четко указано например, как протестировать дроплет orderlookup. Я тоже ответил на свой вопрос. - person Mani manasa mylavarapu; 25.01.2015

Спасибо за ваше мнение. Хорошие новости: мы можем вызывать дроплеты из любого другого API.

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");

здесь параметр «результат» - это выходной параметр, который устанавливает эта капля. И идентификатор пользователя, который я жестко закодировал как «публикацию», которую я создал. Игнорируйте созданный мной класс servletTestUtils, который не имеет большого отношения к теории капель здесь :)

person Mani manasa mylavarapu    schedule 16.12.2014

Я предполагаю из вашего примера кода и того факта, что вы упоминаете DropletInvoker, что вы пишете модульный тест и что это не функциональный код.

Если это функциональный код, вам действительно, действительно не следует вызывать дроплет из другого компонента Nucleus. Капля существует исключительно для использования на странице JSP. Если вам нужна функциональность дроплета в коде Java, вы должны преобразовать дроплет в службу, которая содержит основную логику, и дроплет, который просто выступает в качестве фасада для службы, чтобы ее можно было вызывать со страницы.

В случае дроплета OrderLookup вам не нужно ничего рефакторить. Используемый сервис должен быть OrderManager или OrderTools в зависимости от того, что вам нужно. Обратите внимание, что существует разница между объектами Order и элементами репозитория Order, и вы должны предпочесть использовать объекты Order, поэтому используйте непосредственно репозиторий Order только в том случае, если вам это действительно нужно.

person Vihung    schedule 16.12.2014
comment
Спасибо за предложение. Это было давно, и в то время у меня было меньше знаний об ATG. Капля может быть вызвана из любого места. Допустим, мне нужно провести системное тестирование, и вы просто не можете использовать страницу jsp. Потому что это пользовательский интерфейс и разработчик сайта может реализовать это в любом случае... Мы можем разрешить дроплет и установить некоторые параметры запроса. На самом деле OrderLookupDroplet просто нуждается в идентификаторе пользователя, остальные параметры являются необязательными. Он снова устанавливает выходные параметры для запроса. Метод .service() я также могу получить выходные параметры. вот пример кода - person Mani manasa mylavarapu; 16.12.2014