Клиентский класс Mocking rest с использованием исключения нулевого указателя Mockito

1

Привет, у меня есть класс RestClientUtil который выполняет всю связанную с подключением работу с сервером и получает ответ с помощью остальных служб. Когда я попытался высмеять мой restClientUtil, он издевался успешно, но когда я попробовал метод вызова этого класса, метод вернет ответ как null.when я вижу переменную restClientUtil в режиме отладки, свойство этого класса, например pbsOrderStatusUrl sellerCode т.д., Может быть вызвано тем, что по этой причине ответ приходит нуль, поэтому, пожалуйста, скажите мне, как написать mockito моего OrderStatusUpdate который основан на ответе класса RestClientUtil

Это метод RestClientUtilClass

 public class RestClientUtil{
       @Value("#{externalProperties['PBSUrl']}")
      private String pbsUrl;

    @Value("#{externalProperties['PBSOrderStatusUrl']}")
    private String pbsOrderStatusUrl;

    @Value("#{externalProperties['sellerCode']}")
    private String sellerCode;

    @Value("#{externalProperties['PAYMENT_CLIENT_URL']}")
    private String paymentClientURL;

    @Value("#{externalProperties['PBS_COMMUNICATION_URL']}")
    private String pbsCommunicationURL;

    private WebResource webResource;    

public com.mycompany.wrapper.orderstatusupdate.resp.Response orderStatusUpdateToProvider(
            com.mycompany.wrapper.orderstatusupdate.req.Request req, String specificURL)
            throws EcomGenericException {
        com.mycompany.wrapper.orderstatusupdate.resp.Response response = null;
        int i = 0;
        for (; i < 3; i++) {
//pbsUrl is some UrlTo differntServer
            try {
                Client client = Client.create();
                WebResource webResource = client.resource(UriBuilder.fromUri(
                        pbsUrl).build());
                log.debug("Input to the PBS system for orderStatusUpdateToProvider ==> "
                        + req);
                MultivaluedMap queryParams = new MultivaluedMapImpl();
                queryParams.add("sellerCode", sellerCode);
                response = webResource.path("seller").path("orders")
                        .path(specificURL).queryParams(queryParams)
                        .header("correlationId", req.getCorrelationId())
                        .type(MediaType.APPLICATION_XML)
                        .post(com.mycompany.wrapper.orderstatusupdate.resp.Response.class,
                                req);
                log.trace("response ==> " + response);
                if (null == response) {
                    log.error("Order Update Status  is null");
                    throw new EcomGenericException("validation_500");
                }
                break;
            } catch (UniformInterfaceException e) {

            }
        }

        return response;
    }
}

Это класс, в котором я вызываю метод RestClientUtil

     @Service
    public class OrderStatusUpdate {

        private static final Logger logger = Logger
                .getLogger(OrderStatusUpdate.class);
        @Resource(name = "restClientUtil")
        protected RestClientUtil restClientUtil;

        @Resource(name = "blOrderService")
        protected OrderService orderService;
        public void setRestClientUtil(RestClientUtil restClientUtil) {
            this.restClientUtil = restClientUtil;
        }

        public void setOrderService(OrderService orderService) {
            this.orderService = orderService;
        }


        public void orderStatusUpdate(Order order, String providerStatus, String targetStatus,
                String dateTime, String targetURI) throws EcomGenericException,  org.broadleafcommerce.core.pricing.service.exception.PricingException {

            Request request = new ObjectFactory()
                    .createRequest();
            Request.Order orderReq = new Request.Order();
            orderReq.setOrderId(order.getOrderNumber());
            orderReq.setStatus(providerStatus);
            orderReq.setDateTime(dateTime);
            request.setOrder(orderReq);
            request.setCorrelationId(UUID.randomUUID().toString());
            com.mycompany.wrapper.orderstatusupdate.resp.Response response = restClientUtil.orderStatusUpdateToProvider(request,targetURI);
            if (response != null && ApplicationConstants.PROVIDER_SUCCESS_IDENTIFIER.equals(response.getStatus().getCode())) {
                order.setStatus(CustomOrderStatus.getInstance(targetStatus));
                orderService.save(order, false);
            } else {
logger.error("OrderStatusUpdate call failed from the Provider end for ECOM OrderID " +order.getId()+ " with ErrorCode "+ response.getStatus().getCode() + " with Error message "+ response.getStatus().getMessage());
            throw new EcomGenericException("validation_500");
            }
        }

    }

Это тест mockito, который я пытался реализовать

  public class OrderStatusUpdateTest {

    protected RestClientUtil restClientUtil;

    protected OrderService orderService;

    protected OrderStatusUpdate orderStatusUpdate;
    protected Request request;
    private Response response;
    private Order blcOrder;
    private com.mycompany.account.CustomOrderStatus CustomOrderStatus;

    @Before
    public void setUp() {
     restClientUtil=mock(RestClientUtil.class);
     orderService=mock(OrderService.class);
     blcOrder=new OrderImpl();
     request=new Request();
     blcOrder.setStatus(CustomOrderStatus.PAYMENT_COMPLETED);
     orderStatusUpdate=new OrderStatusUpdate();
     orderStatusUpdate.setOrderService(orderService);
     orderStatusUpdate.setRestClientUtil(restClientUtil);
     Request.Order order=new Request.Order();
     order.setOrderId("123455");
     order.setStatus("PAYMENT COMPLETED");
     order.setDateTime("2013-11-21T09:30:47+0500");
     request.setCorrelationId("12343");
     request.setOrder(order);

     when(restClientUtil.orderStatusUpdateToProvider(request, "http://localhost:8080/")).thenReturn(response);
    }

    @Test
    public void test() throws PricingException {

        orderStatusUpdate.orderStatusUpdate(blcOrder, "PAYMENT COMPLETED","IN_PAYMENT", "2013-11-21T09:30:47+0500", "http://localhost:8080/");
        verify(restClientUtil.orderStatusUpdateToProvider(request, "http://localhost:8080/"));
        verify(orderService.save(blcOrder, false));

        fail("Not yet implemented");
    }

}

это журнал ошибок

 java.lang.NullPointerException
    at com.mycompany.api.service.orderstatusupdate.OrderStatusUpdate.orderStatusUpdate(OrderStatusUpdate.java:72)
    at com.mycompany.api.service.orderstatusupdate.test.OrderStatusUpdateTest.test(OrderStatusUpdateTest.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
  • 0
    Можете ли вы выделить строку 72 в своем классе OrderStatusUpdate с // exception here или аналогичным.
  • 0
    @Duncan вы можете увидеть регистратор внутри метода класса OrderStatusUpdate orderStatusUpdate (....) это 72 строки, потому что здесь используется ответ
Показать ещё 4 комментария
Теги:
junit
mockito
springmockito
rest-client

1 ответ

1

В линии:

when(restClientUtil.orderStatusUpdateToProvider(request,"http://localhost:8080")).thenReturn(response);

response не инициализирован.

Условие if-else неверно в методе orderStatusUpdate, потому что если response имеет значение NULL, регистратор все равно пытается получить от него код состояния.

  • 0
    я удалю регистратор, но ответ все еще не получен. Мне нужен ответ для проверки функциональности моей функции. Как мне это получить?
  • 0
    @henrycharles В вашем тесте вам нужно создать объект response . Т.е. response = new Response(); , или похожие.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню