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);
}