PowerMock Java URL с использованием EasyMock

У меня есть следующий код...

@Test
public void wrapSoapTest1() throws TransformerConfigurationException, IOException {
    RequestUtil r = new RequestUtil(SAMPLE_REQUEST_BEFORE.getBytes(),"");
    URL url = PowerMock.createNiceMock(URL.class);
    r.setXslUrl(url);
    EasyMock.expect(url.openStream()).andReturn(IOUtils.toInputStream(XSLT, "UTF-8"));
    Assert.assertEquals(SAMPLE_REQUEST_AFTER, new String(r.wrapSOAP()));
}

Когда я запускаю это, я получаю следующую ошибку....

java.lang.AbstractMethodError: java/net/URLStreamHandler.openConnection(Ljava/net/URL;)Ljava/net/URLConnection;
at java.net.URL.openConnection(URL.java:957)

Есть ли способ смоделировать URL-адрес и отправить пользовательскую строку в качестве ответа?

3 ответа

Если вы используете PowerMock Вы должны убедиться, что ваш тестовый пример помечен @RunWith(PowerMockRunner.class), Чем ты должен сказать PowerMock подготовить URL класс для теста (@PrepareForTest({ URL.class })) и вы должны использовать PowerMock.expectLastCall() вместо EasyMock методы. По крайней мере, вы должны поставить макет в режим воспроизведения.

Это должно работать.

@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class })
public class SoapTest {
    @Test
    public void wrapSoapTest1() throws TransformerConfigurationException,
        IOException {
        RequestUtil r = new RequestUtil(SAMPLE_REQUEST_BEFORE.getBytes(),"");
        URL url = PowerMock.createNiceMock(URL.class);
        r.setXslUrl(url);
        url.openStream();
        PowerMock.expectLastCall().andReturn(IOUtils.toInputStream(XSLT, "UTF-8"));
        PowerMock.replay(url);
        Assert.assertEquals(SAMPLE_REQUEST_AFTER, new String(r.wrapSOAP()));
    }
}

У меня есть TestNG, PowerMock и EasyMock, и единственное отличие состоит в том, что мне пришлось добавить @PrepareForTest({ MyTestedClass.class }), в моем случае MyTestedClass - UrlScreenRequest.

    @PrepareForTest({UrlScreenRequest.class})
    public class UrlScreenRequestTest  extends PowerMockTestCase {
    ...
    @Test
    public void testValidatePermission() throws Exception {
      URL url=PowerMock.createNiceMock(URL.class);
      HttpURLConnection connection = createMock(HttpURLConnection.class);
      url.openConnection();
      PowerMock.expectLastCall().andReturn(connection);
      PowerMock.replayAll(url, connection);
      UrlScreenRequest request = new UrlScreenRequest(url);
      request.validatePermission();
      //validation
    }
    ...

Моя версия выглядит так...

private URL mockURL() throws IOException{
    final URLConnection mockConnection = PowerMock.createMock(URLConnection.class);
    InputStream i = IOUtils.toInputStream(XSLT, "UTF-8");
    EasyMock.expect(mockConnection.getInputStream()).andReturn(i);
    EasyMock.replay(mockConnection);
    final URLStreamHandler handler = new URLStreamHandler() {
        @Override
        protected URLConnection openConnection(final URL arg0)
                throws IOException {
            return mockConnection;
        }
    };
    return new URL("http://foo.bar", "foo.bar", 80, "", handler);
}
Другие вопросы по тегам