Hi i have class RestClientUtil
which perform all the connection related operation with server and get the response using 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
This is the method of 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
@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.
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.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.