2013-05-06 74 views
2

如何嘲笑如何嘲笑WebResource REST調用

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

回答

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請求,但都需要不同的緊密耦合的測試代碼。這不是你想要測試的方式。

0

我也收到了NullPointerException。我周圍有從調用返回一個模擬生成器對象來接受()

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

做什麼,我希望它。