JUnit тест на URLConnection, использовать EasyMock? - PullRequest
3 голосов
/ 06 апреля 2011

Эй, пытались решить это в течение последнего дня или около того, но били по кирпичной стене. Пытаюсь протестировать этот бит кода. Но не уверен, если нужно использовать EasyMock или нет? В Интернете можно найти несколько примеров, но, похоже, используются более старые методы.

public boolean verifyConnection(final String url) {
    boolean result;

    final int timeout = getConnectionTimeout();
    if (timeout < 0) {
        log.info("No need to verify connection to client. Supplied timeout = {}", timeout);
        result = true;
    } else {
        try {
            log.debug("URL: {} Timeout: {} ", url, timeout);

            final URL targetUrl = new URL(url);
            final HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();

            connection.setConnectTimeout(timeout);
            connection.connect();
            result = true;
        } catch (ConnectException e) {
            log.warn("Could not connect to client supplied url: " + url, e);
            result = false;
        } catch (MalformedURLException e) {
            log.error("Malformed client supplied url: " + url, e);
            result = false;
        } catch (IOException e) {
            log.warn("Could not connect to client supplied url: " + url, e);
            result = false;
        }
    }
    return result;
}

Он просто принимает URL-адрес, проверяет его действительность и возвращает T или F.

Ответы [ 3 ]

2 голосов
/ 06 апреля 2011

Я всегда замечал, что Mocking можно избежать в максимально возможной степени, потому что это может привести к затруднению поддержки тестов JUnit и к полной неудаче цели.

Я бы предложил создать временный сервер на вашем локальном компьютере.машина от самой Юнит.В начале JUnit вы можете создать сервер (требуется не более 10-15 строк кодирования) с использованием сокетов Java, а затем в своем коде передать URL для локального сервера.Таким образом вы уменьшаете количество насмешек и гарантируете максимальный охват кода.

Примерно так -

public class SimpleServer extends Thread {

public void run() {
    try {
        serverSocket = new ServerSocket(port);

          while (true) {
            Socket s = serverSocket.accept(); 
          }
    } 
    catch (IOException e) {
            e.printStackTrace();
    }
    finally {
        serverSocket = null;
    }
}
}
2 голосов
/ 06 апреля 2011

Попытка настроить фиктивную реализацию HttpURLConnection.Например,

public class MockHttpURLConnection extends HttpURLConnection { '

, затем добавили метод в класс для переопределения

' protected HttpURLConnection createHttpURLConnection(URL url)
        throws IOException {
    return (HttpURLConnection) url.openConnection();
}

Итак, тест выглядит примерно так:

@Test
public void testGetContentOk() throws Exception
{
    String url = "http://localhost";

    MockHttpURLConnection mockConnection = new MockHttpURLConnection();

    TestableWebClient client = new TestableWebClient();
    client.setHttpURLConnection(mockConnection);

    boolean result = client.verify(url);

    assertEquals(true, result);
}

@Test
public void testDoesNotGetContentOk() throws Exception
{
    String url = "http://1.2.3.4";

    MockHttpURLConnection mockConnection = new MockHttpURLConnection();

    TestableWebClient client = new TestableWebClient();
    client.setHttpURLConnection(mockConnection);

    boolean result = client.verify(url);

    assertEquals(false, result);
}

/**
 * An inner, private class that extends WebClient and allows us
 * to override the createHttpURLConnection method.
 */
private class TestableWebClient extends WebClient1 {

    private HttpURLConnection connection;

    /**
     * Setter method for the HttpURLConnection.
     *
     * @param connection
     */
    public void setHttpURLConnection(HttpURLConnection connection)
    {
        this.connection = connection;
    }

    /**
     * A method that we overwrite to create the URL connection.
     */
    @Override
    public HttpURLConnection createHttpURLConnection(URL url) throws IOException
    {
        return this.connection;
    }
}

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

2 голосов
/ 06 апреля 2011

Если вы хотите издеваться над этим методом, я бы рекомендовал передать URL, а не String.Не заставляйте ваш метод создавать URL, который ему нужен;позвольте клиенту создать URL для вас и передать его. Таким образом, ваш тест может заменить имитацию, если это необходимо.

Это почти идея внедрения зависимостей - ваш метод должен иметь свои зависимости, а не создавать ихсам по себе.Призыв к «новому» - это раздача мертвых.

Это не радикальное изменение.Вы можете перегружать метод и иметь две подписи: одну, которая принимает строку URL, и другую, которая принимает сам URL.Пусть первый метод создаст URL и вызовет второй.Таким образом, вы можете протестировать его и все еще иметь метод с подписью String в вашем API для удобства.

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