Я написал код, который вызывает API-интерфейс клиента Jersey, который, в свою очередь, вызывает веб-сервис, который не поддается контролю. Я не хочу, чтобы мой unit test вызывал фактическую веб-службу.
Каков наилучший подход для написания кода unit test для кода, который вызывает API-интерфейс клиента Jersey? Должен ли я использовать API-интерфейс Джерси для создания веб-службы JAX-RS, а затем использовать тестовую платформу Джерси для unit test? Или я должен высмеивать звонки веб-службы Джерси? У меня есть доступ к 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-клиентов Джерси.