Я написал код, который вызывает клиентский API Джерси, который, в свою очередь, вызывает веб-службу, которая находится вне моего контроля. Я не хочу, чтобы мой модульный тест вызывал реальную веб-службу.
Каков наилучший подход к написанию модульного теста для кода, вызывающего клиентский API Джерси? Должен ли я использовать API-интерфейс сервера Джерси для написания веб-службы JAX-RS, а затем использовать инфраструктуру тестирования Джерси для модульного теста? Или я должен издеваться над вызовами веб-службы Джерси? У меня есть доступ к JMock. Или я должен попробовать другой подход?
Во время моего исследования я нашел это обсуждение, описывающее различные варианты, но я нашел полное решение. Имеются ли примеры кода, демонстрирующие предлагаемый подход JUnit? Я не смог найти ничего в документации Джерси.
Вот соответствующий исходный код:
public String getResult(URI uri) throws Exception {
// error handling code removed for clarity
ClientConfig clientConfig = new DefaultClientConfig();
Client client = Client.create(clientConfig);
WebResource service = client.resource(uri);
String result = service.accept(accept).get(String.class);
return result;
}
Вот примеры тестового кода, который я хотел бы пройти. Я хотел бы проверить (1) передачу действительного URI и получение действительной строки обратно и (2) передачу недопустимого (по какой-либо причине - недостижимого или несанкционированного) URI и получение исключения обратно.
@Test
public void testGetResult_ValidUri() throws Exception {
String xml = retriever.getResult(VALID_URI);
Assert.assertFalse(StringUtils.isBlank(xml));
}
@Test(expected = IllegalArgumentException.class)
public void testGetResult_InvalidUri() throws Exception {
retriever.getResult(INVALID_URI);
}
Все вышесказанное является простым описанием того, что делает мой код. На самом деле поверх этого уровня находится слой, который принимает два URI, сначала пытается вызвать первый URI, а если этот URI не работает, то пытается вызвать второй URI.Я хотел бы иметь модульные тесты, охватывающие (1) первый URI успешно, (2) первый URI терпит неудачу и второй URI успешно, и (3) оба URI терпят неудачу.Этот код достаточно сложен, поэтому я хочу протестировать эти различные сценарии с помощью JUnit, но для этого мне нужно либо запустить настоящие резервные веб-службы, либо имитировать вызовы API клиента Джерси.