我需要使用JUnit测试以下代码。对我来说,这看起来很复杂,我甚至不知道从哪里开始。
我知道这个方法在做什么,但我无法为它写一个JUnit测试。在测试任何一段代码时,我们是否遵循某种模式或牢记一些关键点?
protected WebResource.Builder applyHeaders(WebResource service, List<? extends BaseClientHeader<?>> headers, List<HttpRequestClientHeader> httpHeaders) {
WebResource.Builder wrb = service.getRequestBuilder();
if( headers != null ) {
for( BaseClientHeader<?> header : headers ) {
wrb = wrb.header( ((IEnum)header.getName()).value(), header.getValue() );
}
}
if( httpHeaders != null ) {
for( HttpRequestClientHeader header : httpHeaders ) {
wrb = wrb.header( header.getName().value(), header.getValue() );
}
}
return wrb;
}
谢谢,
即使这个方法看起来做了许多不同的事情,并与许多其他代码交互,它应该相当容易测试;那是因为它只对你交上来的东西起作用。让我们看看…
@Test
public void requestBuilderIsReturned() {
WebResource webResource = Mockito.mock(WebResource.class);
WebResource.Builder webResourceBuilder = mock(WebResource.Builder.class);
when(webResource.getRequestBuilder()).thenReturn(webResourceBuilder);
WebResource.Builder createdBuilder = objectUnderTest.applyHeaders(webResource, null, null);
assertThat(createdBuilder, is(webResourceBuilder));
}
这很直接。为了验证对这两种报头的正确操作,我想您需要一点技巧:
when(webResourceBuilder.header(anyString(), anyString())).thenReturn(webResourceBuilder);
这只会使header()
方法返回它所调用的对象。之后,验证是否调用了正确的方法就很简单了:
verify(webResourceBuilder).header("header1", "value1");
verify(webResourceBuilder).header("header2", "value2");
有了这个,您应该能够对这个特定方法进行单元测试。:)