2

如何模拟以下代码行

WebResource jobBuilder = restClient.resource(jobBuilderUrl);
String jobXml = jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .type(MediaType.APPLICATION_JSON)
    .entity(request)
    .post(String.class);

我尝试使用带有以下代码的简单模拟来模拟它,但它返回 NullPointerException

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);
4

2 回答 2

1

如何模拟以下代码行

不。它没有任何价值。而是启动嵌入式 HTTP 服务器并验证它是否接收到您期望的请求。这是您在编写此代码时真正关心的内容,因此您应该进行测试。使用Simple FrameworkJetty很容易做到这一点。

一个例子:

jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .type(MediaType.APPLICATION_JSON)
    .entity(request)
    .post(String.class);

等同于:

jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .entity(request)
    .type(MediaType.APPLICATION_JSON)
    .post(String.class);

等同于:

jobBuilder
    .accept(MediaType.APPLICATION_XML)
    .type(MediaType.APPLICATION_JSON)
    .post(String.class, entity);

... 等等。所有这些都创建相同的 HTTP 请求,但都需要不同且紧密耦合的测试代码。这不是你想要的测试。

于 2013-05-07T00:29:32.090 回答
0

我也得到了 NullPointerException 。我通过从对 accept() 的调用中返回一个 Mock Builder 对象来解决它

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);

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

ClientResponse response = this.jobResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);

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

做我期望的。

于 2014-08-06T21:45:25.703 回答