Я пытаюсь использовать PowerMockito, чтобы издеваться над созданием класса java.net.URL в моем коде, который я тестирую. По сути, я хочу предотвратить возникновение реального HTTP-запроса и вместо этого 1) проверить данные при выполнении запроса и 2) предоставить свои собственные тестовые данные обратно в издевательском ответе. Вот что я пытаюсь:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class })
public class Test {
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
...
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
...
}
Код, который я хочу протестировать, выглядит так:
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
Ранее в моем тестовом сценарии я имитировал wlInvokeUrlString, чтобы он соответствовал «MyURLString». Я также пытался использовать различные другие формы строки whenNew, пытаясь внедрить макет. Что бы я ни пытался, это никогда не перехватывает конструктор. Все, что я хочу сделать, это «перехватить» вызов openConnection() и заставить его вернуть мое фиктивное HTTP-соединение вместо реального.
Я издевался над другими классами перед этим в том же скрипте, и они работают, как и ожидалось. Либо мне нужна вторая пара глаз (вероятно, так), либо в классе URL есть что-то уникальное. Я заметил, что если я использую «whenNew(URL.class).withAnyArguments()» и изменю «thenReturn» на «thenAnswer», я могу заставить его срабатывать. Единственная проблема в том, что я никогда не получаю вызов URL для своего кода. То, что я вижу, это вызов конструктора с тремя аргументами для URL.class со всеми нулями для параметров. Может ли быть, что этот класс из среды выполнения Java и загружается программой запуска тестов? Любая помощь горячо приветствуется.
HttpURLConnection
, ноURL
иURLConnection
. ВHttpURLConnection
нет ничего полезного. URL-адрес предназначен для абстрагирования транспортного уровня. - person Jérémie B   schedule 22.02.2016