简体   繁体   English

使用Mockito模拟Rest Client类抛出空指针异常

[英]Mocking rest client class using mockito throw null pointer exception

Hi i have class RestClientUtil which perform all the connection related operation with server and get the response using rest Services. 嗨,我有RestClientUtil类,它与服务器执行所有与连接有关的操作,并使用rest Services获得响应。 When i tried to mock my restClientUtil its mocked successfully but when i tried calling method of this class,method will return response as null.when i see restClientUtil variable in debug mode ,property of this class like pbsOrderStatusUrl sellerCode etc are coming null may be because of this reason response is coming null so please tell me the way to write mockito of my OrderStatusUpdate which is based upon response of RestClientUtil class 当我尝试模拟我的restClientUtil时,成功模拟了它,但是当我尝试调用此类的方法时,方法将返回null响应。当我在调试模式下看到restClientUtil变量时,此类的属性(例如pbsOrderStatusUrl sellerCode等) pbsOrderStatusUrl null可能是因为由于这个原因,响应将为空,因此请告诉我基于RestClientUtil类的响应编写OrderStatusUpdate的模拟的方法

This is the method of RestClientUtilClass 这是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;
    }
}

This is the class where i am calling RestClientUtil Method 这是我调用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");
            }
        }

    }

This is the mockito Test i tried to implement 这是我尝试实施的模拟测试

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

}

this is the error log 这是错误日志

 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)

In the line: 在该行中:

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

response is not initialized. response未初始化。

The if-else condition is incorrect in orderStatusUpdate method, because if the response is null , the logger still tries to access the status code from it. orderStatusUpdate方法中的if-else条件不正确,因为如果responsenull ,则记录器仍尝试从中访问状态代码。

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

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