【问题标题】:How can I mock the HttpUrlConnection.getResponseCode() method using EasyMock如何使用 EasyMock 模拟 HttpUrlConnection.getResponseCode() 方法
【发布时间】:2020-06-30 15:14:06
【问题描述】:

我正在尝试为以下代码 sn-p 编写测试用例。但是模拟没有按预期工作。

Map<String, String> request = new HAshMap<String, String>();
URL url = new URL("sampleurl");
HttpUrlConnection connection = (HttpUrlConnection) url.openConnection();

if(connection != null){
connection.setDOutput(true);

OutputStreamReader out = new OutputStreamReader(connection.getOutputStream());
out.write(new Gson().toJson(request);
out.close();

int responseCode = connection.getResponseCode();
}

我已尝试使用以下测试代码 sn-p 进行模拟,但 Mock 无法正常工作,我做错了

 URL url = PowerMock.createNiceMock(URL.class);
 HttpsUrlConnection httpConn = PowerMock.createNiceMock(HttpsUrlConnection.class);

 EasyMock.expect(url.openConnection()).andReturn(httpConn);
 EasyMock.expect(httpConn.getResponseCode()).andReturn(500);

【问题讨论】:

  • 你创建了新的 url:URL url = new URL("sampleurl"); 你没有在被测方法中使用你的模拟实例。

标签: java junit easymock


【解决方案1】:

评论是对的。需要注入一个模拟。我强烈建议您首先记录自己的概念。

在您的情况下,对象是在方法中创建的,因此通常我们会说它不能被模拟。从关注点分离来看,这种方法做的事情太多了。

如果我们想保持相同的代码并采用 PowerMock 方式,它将如下所示。我会给你我测试过的课程和我的测试。

public class MyClass {

    public int call() throws Exception {
        Map<String, String> request = new HashMap<>();
        URL url = new URL("sampleurl");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        return connection.getResponseCode();
    }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest({MyClass.class, URL.class})
public class MyClassTest {

    private MyClass testClass = new MyClass();

    @Test
    public void test() throws Exception {
        URL url = PowerMock.createMock(URL.class);
        HttpURLConnection httpConn = PowerMock.createMock(HttpURLConnection.class);

        PowerMock.expectNew(URL.class, "sampleurl").andReturn(url);
        EasyMock.expect(url.openConnection()).andReturn(httpConn);
        EasyMock.expect(httpConn.getResponseCode()).andReturn(500);

        PowerMock.replayAll();

        assertThat(testClass.call()).isEqualTo(500);
    }
}

但我实际上永远不会编写这样的代码。我会用更好的设计重构。可能有另一个类来创建连接。如果我要重构,最低限度是:

public class MyClass {

    public int call() throws Exception {
        Map<String, String> request = new HashMap<>();
        HttpURLConnection connection = getConnection();
        return connection.getResponseCode();
    }

    HttpURLConnection getConnection() throws IOException {
        URL url = new URL("sampleurl");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        return connection;
    }
}

public class MyOtherTest extends EasyMockSupport {

    private MyClass testClass = partialMockBuilder(MyClass.class)
            .addMockedMethod("getConnection")
            .mock();

    @Test
    public void test() throws Exception {
        HttpURLConnection httpConn = mock(HttpURLConnection.class);
        expect(httpConn.getResponseCode()).andReturn(500);
        expect(testClass.getConnection()).andReturn(httpConn);

        replayAll();

        assertThat(testClass.call()).isEqualTo(500);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多