Привет, у меня есть класс RestClientUtil
который выполняет всю связанную с подключением работу с сервером и получает ответ с помощью остальных служб. Когда я попытался высмеять мой restClientUtil, он издевался успешно, но когда я попробовал метод вызова этого класса, метод вернет ответ как null.when я вижу переменную restClientUtil в режиме отладки, свойство этого класса, например pbsOrderStatusUrl
sellerCode
т.д., Может быть вызвано тем, что по этой причине ответ приходит нуль, поэтому, пожалуйста, скажите мне, как написать mockito моего OrderStatusUpdate
который основан на ответе класса RestClientUtil
Это метод 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");
}
}
}
Это тест 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)
В линии:
when(restClientUtil.orderStatusUpdateToProvider(request,"http://localhost:8080")).thenReturn(response);
response
не инициализирован.
Условие if-else
неверно в методе orderStatusUpdate
, потому что если response
имеет значение NULL, регистратор все равно пытается получить от него код состояния.
response
. Т.е. response = new Response();
, или похожие.
OrderStatusUpdate
с// exception here
или аналогичным.