簡體   English   中英

使用Mockito模擬Rest Client類拋出空指針異常

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

嗨,我有RestClientUtil類,它與服務器執行所有與連接有關的操作,並使用rest Services獲得響應。 當我嘗試模擬我的restClientUtil時,成功模擬了它,但是當我嘗試調用此類的方法時,方法將返回null響應。當我在調試模式下看到restClientUtil變量時,此類的屬性(例如pbsOrderStatusUrl sellerCode等) pbsOrderStatusUrl null可能是因為由於這個原因,響應將為空,因此請告訴我基於RestClientUtil類的響應編寫OrderStatusUpdate的模擬的方法

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

    }

這是我嘗試實施的模擬測試

  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)

在該行中:

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

response未初始化。

orderStatusUpdate方法中的if-else條件不正確,因為如果responsenull ,則記錄器仍嘗試從中訪問狀態代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM