[英]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
条件不正确,因为如果response
为null ,则记录器仍尝试从中访问状态代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.