2015-11-30 3 views
2

Я использую джерси 2test jersey 2 client and webtarget

У меня есть абстрактный класс, с помощью которого я строю свою просьбу. Теперь у меня также есть некоторые абстрактные классы клиентов, которые я использую как прокси-классы и фактические реализации. Они работают хорошо, но непроверены.

Мой вопрос в том, как я мог проверить это, без необходимости запуска веб-сервиса, к которому он подключается?

public abstract class AbstractRestProxy { 

private Client client; 
private WebTarget service; 

/** 
* Get the base {@link Client} and {@link WebTarget} 
*/ 
@PostConstruct 
public void base() { 
    this.client = ClientBuilder.newClient(); 
    this.service = this.client.target(this.getBaseUri()); 
} 

/** 
* close the connection before destroy 
*/ 
@PreDestroy 
protected void close() { 
    if (this.client != null) { 
     this.client.close(); 
    } 
} 

/** 
* 
* @return get the basePath 
*/ 
protected abstract String getBasePath(); 

/** 
* 
* @return get the baseUri 
*/ 
protected abstract String getBaseUri(); 

/** 
* 
* @param paths 
*   the paths to get for the rest service 
* @return {@link javax.ws.rs.client.Invocation.Builder} 
*/ 
protected Builder getRequest(final String... paths) { 
    WebTarget serviceWithPath = this.getServiceWithPaths(); 
    for (final String path : paths) { 
     serviceWithPath = serviceWithPath.path(path); 
    } 
    return serviceWithPath.request(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON); 
} 

Метод, который я использую для получения ответа с идентификатором, я использую этот метод.

public Response getByID(final ID identifier) { 
    return this.getRequest(identifier.toString()).get(); 
} 
+0

Если вы протестируете любую прямую реализацию этого «базового клиента», вы также протестируете «базовый клиент». Я предлагаю использовать такие вещи, как Wiremock, для тестирования вашего клиента без необходимости запуска полного сервиса. Также не забудьте ВСЕГДА вызвать response.close() на ответ JAX-RS или вы будете утечки ресурсов (например, HTTP-соединения). –

ответ

3

Я нашел, что это работает хорошо. Поскольку я высмеиваю даже ответ, я не думаю, что мне нужно закрыть ответ.

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClientBuilder.class) 
public class AbstractGenericRestActiveProxyTest { 

final Client mockClient = Mockito.mock(Client.class); 
final Response mockResponse = Mockito.mock(Response.class); 

private final AbstractRestProxy proxy = new AbstractRestProxy(); 

@Before 
public void start() { 
    Mockito.when(this.mockResponse.getStatus()).thenReturn(200); 

    final Builder mockBuilder = Mockito.mock(Builder.class); 
    Mockito.when(mockBuilder.get()).thenReturn(this.mockResponse); 
    Mockito.when(mockBuilder.post(Matchers.any())).thenReturn(this.mockResponse); 
    Mockito.when(mockBuilder.put(Matchers.any())).thenReturn(this.mockResponse); 
    Mockito.when(mockBuilder.delete()).thenReturn(this.mockResponse); 

    final WebTarget mockWebTarget = Mockito.mock(WebTarget.class); 
    Mockito.when(mockWebTarget.path(Matchers.anyString())).thenReturn(mockWebTarget); 
    Mockito.when(mockWebTarget.request(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON)).thenReturn(mockBuilder); 

    Mockito.when(this.mockClient.target(Matchers.anyString())).thenReturn(mockWebTarget); 

    PowerMockito.mockStatic(ClientBuilder.class); 
    PowerMockito.when(ClientBuilder.newClient()).thenReturn(this.mockClient); 
    this.proxy.base(); 
} 

@After 
public void stop() { 
    this.proxy.close(); 
} 

@Test 
public void testGetByID() { 
    Mockito.when(this.mockResponse.getStatus()).thenReturn(200); 

    final Response result = this.proxy.getByID(1); 
    Assert.assertEquals(200, result.getStatus()); 
} 
Смежные вопросы