首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟WebResource Rest调用

如何模拟WebResource Rest调用
EN

Stack Overflow用户
提问于 2013-05-07 04:04:57
回答 2查看 1.3K关注 0票数 2

如何模拟以下代码行

代码语言:javascript
复制
WebResource jobBuilder = restClient.resource(jobBuilderUrl);
String jobXml = jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .type(MediaType.APPLICATION_JSON)
    .entity(request)
    .post(String.class);

我尝试使用下面的代码使用简单的模拟来模拟它,但它返回了一个NullPointerException

代码语言:javascript
复制
WebResource jobBuilder = EasyMock.createMock(WebResource.class);
expect(jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .type(MediaType.APPLICATION_JSON)
    .entity(EasyMock.notNull())
    .post(String.class)).andReturn("<test></test>");
replay(jobBuilder);
EN

回答 2

Stack Overflow用户

发布于 2013-05-07 08:29:32

如何模拟以下代码行

不要,它没有任何价值。相反,启动一个嵌入式HTTP服务器并验证它是否接收到您期望的请求。这才是您在编写这段代码时真正关心的,所以这也是您应该测试的。使用Simple FrameworkJetty很容易做到这一点。

举个例子:

代码语言:javascript
复制
jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .type(MediaType.APPLICATION_JSON)
    .entity(request)
    .post(String.class);

等同于:

代码语言:javascript
复制
jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .entity(request)
    .type(MediaType.APPLICATION_JSON)
    .post(String.class);

等同于:

代码语言:javascript
复制
jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .type(MediaType.APPLICATION_JSON)
    .post(String.class, entity);

..。诸若此类。它们都创建相同的HTTP请求,但都需要不同的紧密耦合的测试代码。这不是你想要的测试结果。

票数 1
EN

Stack Overflow用户

发布于 2014-08-07 05:45:26

我也得到了NullPointerException。我通过从accept()的调用中返回一个模拟生成器对象来解决这个问题。

代码语言:javascript
复制
ClientResponse clientResponse = createMock(ClientResponse.class);
expect(clientResponse.getStatus()).andReturn(200).anyTimes();
expect(clientResponse.getEntity(FOO.class)).andReturn(jobInfo).anyTimes();
replay(clientResponse);

Builder builder = createMock(Builder.class);
expect(builder.get(ClientResponse.class)).andReturn(clientResponse).anyTimes();
replay(builder);

WebResource jobResource = createMock(WebResource.class);
expect(jobResource.accept(MediaType.APPLICATION_JSON)).andReturn(builder).anyTimes();
replay(jobResource);

现在我的生产代码中的调用

代码语言:javascript
复制
ClientResponse response = this.jobResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);

FOO foo = response.getEntity(FOO.class);

做了我期望的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16406365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档