Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Mani manasa mylavarapuОтветов: 3

Я пытаюсь 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 .... а во втором случае, хотя я знаю, как его использовать, я все еще терплю неудачу! пожалуйста, помогите мне .. спасибо заранее

javaatgatg-dropletatg-dust

Ответы

Ответ 1 · рейтинг 1 · hpruszyn

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

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

Ответ 2 · рейтинг 1 · Mani manasa mylavarapu

Спасибо за ваше мнение. Хорошие новости: мы можем вызывать дроплеты из любого другого 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, который не имеет большого отношения к теории капель здесь :)

Ответ 3 · Vihung

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы