макет https запрос в Java - PullRequest
       5

макет https запрос в Java

5 голосов
/ 04 октября 2010

Допустим, я пишу приложение, и мне нужно иметь возможность сделать что-то вроде этого:

String url = "https://someurl/";
GetMethod method = new GetMethod(URLEncoder.encode(url));
String content = method.getResponseBodyAsString();

Есть ли способ предоставить фиктивный сервер, который позволил бы мне обрабатывать запрос https? То, что я ищу, - это способ написания модульных тестов, но мне нужно иметь возможность смоделировать ту часть, которая фактически выходит на https://someurl, чтобы я мог получить известный ответ.

Ответы [ 9 ]

4 голосов
/ 02 августа 2013

Взгляните на jadler (http://jadler.net), библиотеку http stubbing / mocking, над которой я работал в течение некоторого времени. Стабильная версия 1.0.0 была только что выпущена, она должна предоставить запрошенные вами возможности:

@Test
public void getAccount() {

    onRequest()
        .havingMethodEqualTo("GET")
        .havingURIEqualTo("/accounts/1")
        .havingBody(isEmptyOrNullString())
        .havingHeaderEqualTo("Accept", "application/json")
    .respond()
        .withTimeout(2, SECONDS)
        .withStatus(200)
        .withBody("{\"account\":{\"id\" : 1}}")
        .withEncoding(Charset.forName("UTF-8"))
        .withContentType("application/json; charset=UTF-8");

    final AccountService service = new AccountServiceRestImpl("http", "localhost", port());
    final Account account = service.getAccount(1);

    assertThat(account, is(notNullValue()));
    assertThat(account.getId(), is(1));
}


@Test
public void deleteAccount() {

    onRequest()
        .havingMethodEqualTo("DELETE")
        .havingPathEqualTo("/accounts/1")
    .respond()
        .withStatus(204);

    final AccountService service = new AccountServiceRestImpl("http", "localhost", port());
    service.deleteAccount(1);

    verifyThatRequest()
        .havingMethodEqualTo("DELETE")
        .havingPathEqualTo("/accounts/1")
    .receivedOnce();
}
3 голосов
/ 05 октября 2010

У вас есть два варианта:

1. Абстрагируй призыв к фреймворку и проверь это.

например. рефакторинг кода, чтобы вы могли внедрить фиктивную реализацию в какой-то момент. Есть много способов сделать это. например создайте getUrlAsString () и смоделируйте это. (также предлагается выше). Или создайте фабрику получения URL, которая возвращает объект GetMethod. Тогда фабрика может быть осмеяна.

2. Запустите сервер приложений как часть теста, а затем запустите свой метод для него. (Это будет скорее интеграционный тест)

Это может быть достигнуто несколькими способами. Это может быть внешним по отношению к тесту, например Плагин Maven Jetty. или тест может программно запустить сервер. см .: http://docs.codehaus.org/display/JETTY/Embedding+Jetty

Запуск через https усложнит это, но все еще будет возможно с самозаверяющими сертификатами. Но я бы спросил себя - что именно вы хотите проверить? Я сомневаюсь, что вам действительно нужно проверить функциональность https, это проверенная технология.

Лично я бы выбрал вариант 1 - вы пытаетесь проверить работоспособность внешней библиотеки. Это обычно не нужно. Также хорошей практикой является абстрагирование ваших зависимостей от внешних библиотек.

Надеюсь, это поможет.

2 голосов
/ 04 октября 2010

Вот аналогичный вопрос

Он касается отладки страниц JSP, но работает также и со статическими страницами

2 голосов
/ 04 октября 2010

Если вы пишете модульный тест, вам не нужны внешние зависимости.из API

GetMethod 

простирается

HttpMethod

, так что вы можете легко издеваться над ним с вашей любимой библиотекой насмешек.Ваш

method.getResponseBodyAsString()

вызов может быть поддельным для возврата любых данных, которые вы хотите.

1 голос
/ 04 октября 2010

В какой степени вы заинтересованы в насмешливом вызове «Get», потому что, если вы ищете универсальную среду для пересмотра Java, которая хорошо интегрируется с JUnit и позволяет настраивать ожидания, которые автоматически устанавливаются при включении в комплект JUnit , тогда вам действительно стоит взглянуть на jMock .

Теперь без дополнительного кода трудно определить, действительно ли это то, что вы ищете, но (несколько бесполезный) пример чего-то похожего на пример кода, который вы написали, выглядел бы примерно так:

class GetMethodTest {
@Rule public JUnitRuleMockery context = new JunitRuleMockery();

@Test
public void testGetMethod() throws Exception {
    // Setup mocked object with expectations
    final GetMethod method = context.mock(GetMethod.class);
    context.checking(new Expectations() {{
        oneOf (method).getResponseBodyAsString();
        will(returnValue("Response text goes here"));
    }});

    // Now do the checking against mocked object
    String content = method.getResponseBodyAsString();
}
}
1 голос
/ 04 октября 2010

Вы можете заключить этот код в некоторый класс и использовать WebClient.getUrl (), а затем смоделировать (например, jmock ) этот метод для возврата сохраненных файлов - скажем,

expectation {
   oneOf("https://someurl/"), will(returnValue(someHTML));
}
1 голос
/ 04 октября 2010

Вы всегда можете запустить сервер thttpd как часть вашего модульного теста, чтобы обслуживать запросы локально. Хотя, в идеале, у вас есть хорошо протестированный GetMethod, и тогда вы можете просто высмеять его, и вам не обязательно иметь удаленный сервер для ВСЕХ ваших тестов.

Ресурсы

1 голос
/ 04 октября 2010

Взгляните на JWebUnit http://jwebunit.sourceforge.net/

Вот пример теста ... Это действительно довольно интуитивно понятно.

public class ExampleWebTestCase extends WebTestCase {
    public void setUp() {
        super.setUp();
        setBaseUrl("http://localhost:8080/test");
    }

    public void test1() {
        beginAt("/home");
        clickLink("login");
        assertTitleEquals("Login");
        setTextField("username", "test");
        setTextField("password", "test123");
        submit();
        assertTitleEquals("Welcome, test!");
    }
}
0 голосов
/ 18 марта 2014

Используйте сервер-заглушку xml mimic, который может имитировать статический HTTP-ответ на основе параметров запроса, заголовков и т. Д. Его очень просто настроить и использовать.

http://xmlmimic.sourceforge.net/ http://sourceforge.net/projects/xmlmimic/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...