gpt4 book ai didi

java - 使用mockito模拟其余客户端类抛出空指针异常

转载 作者:太空宇宙 更新时间:2023-11-04 06:55:35 26 4
gpt4 key购买 nike

嗨,我有类 RestClientUtil ,它执行与服务器的所有连接相关操作,并使用其余服务获取响应。当我尝试模拟我的restClientUtil时,它已成功模拟,但当我尝试调用此类的方法时,该方法将返回响应为null。当我在 Debug模式下看到restClientUtil变量时,此类的属性如pbsOrderStatusUrl sellerCode等将为null,可能是因为这个原因响应为null,所以请告诉我如何编写基于RestClientU响应的OrderStatusUpdate的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;
}
}

这是我调用 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 中的条件不正确方法,因为如果responsenull,记录器仍尝试从中访问状态代码。

关于java - 使用mockito模拟其余客户端类抛出空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22782848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com