2014-04-01 60 views
0

嗨,我有类RestClientUtil执行所有与服务器的连接相关的操作,并获得使用休息服务的响应。当我试图嘲笑我的restClientUtil其嘲笑成功,但当我试图调用这个类的方法时,方法将返回响应为null.when我看到restClientUtil变量在调试模式下,这个类的属性像pbsOrderStatusUrlsellerCode等等都是空的可能是因为这个原因响应即将空,因此,请告诉我,这是基于RestClientUtil类的响应写我OrderStatusUpdate的的Mockito方式嘲笑休息客户端类使用mockito抛出空指针异常

这是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; 
    } 
} 

这种方法是类,其中i正在调用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

您可以在'OrderStatusUpdate'类中突出显示第72行,这里有'// exception exception'或类似内容。 –

+0

@Duncan你可以看到OrderStatusUpdate类中的记录器类的方法orderStatusUpdate(....)这是72行导致这里使用的响应 – henrycharles

+0

@Duncan FYI类中的变量用于RestCLientUtil类实时通过属性文件填充 – henrycharles

回答

1

在行:

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

response未初始化。

if-else条件是orderStatusUpdate方法不正确,因为如果response,记录器仍尝试从它访问状态代码。

+0

我会删除记录器,但仍然响应即将到来我需要响应测试我的功能功能我如何得到它? – henrycharles

+0

@henrycharles在你的测试中,你需要构建你的'response'对象。即'response = new Response();'或类似的。 –

+0

@Duncan我会创建响应对象没有问题,但在我的restClientUtil类中它会去orderStatusUpdateToProvider方法在这里我有问题,因为这需要pbsURL sellerCode和更多的参数,然后调用post方法获取响应。实时我打到不同的服务,以获得响应,这是可以在不同的机器上获得响应,他们期望webResource中的参数列表很大,然后他们现在发送响应问题是我如何嘲笑这种行为来获得我的OrderStatusUpdate类中的响应 – henrycharles