【问题标题】:How to implement MockWebServer to work with proxy如何实现 MockWebServer 以使用代理
【发布时间】:2017-06-01 07:12:05
【问题描述】:

我正在尝试从 Square 实现 MockWebServer,并且我在代理后面。问题是每次我执行仪器测试都会失败,因为我对 MockWebServer 所做的每个请求都会收到 407。

debug.level.titleD/OkHttp: <-- 407 Proxy Authentication Required http://localhost:12345/user/login (767ms)

正如你所见,我指向我的本地主机,但我不知道为什么会得到这个!

这是我的 MockWebServer 实现!

public class MockedTestServer {



private final int PORT = 12345;
private final MockWebServer server;
private int lastResponseCode;
private String lastRequestPath;

/**
 * Creates and starts a new server, with a non-default dispatcher
 *
 * @throws Exception
 */
public MockedTestServer() throws Exception {
    server = new MockWebServer();
    server.start(PORT);
    setDispatcher();
}

private void setDispatcher() {
    final Dispatcher dispatcher = new Dispatcher() {
        @Override
        public MockResponse dispatch(final RecordedRequest request) throws InterruptedException {
            try {
                final String requestPath = request.getPath();

                final MockResponse response = new MockResponse().setResponseCode(200);
                String filename;


                // response for alerts
                if (requestPath.equals(Constantes.ACTION_LOGIN)) {
                    filename = ConstantesJSON.LOGIN_OK;

                } else {
                    // no response
                    lastResponseCode = 404;
                    return new MockResponse().setResponseCode(404);
                }
                lastResponseCode = 200;
                response.setBody(RestServiceTestHelper.getStringFromFile(filename));
                lastRequestPath = requestPath;
                return response;
            } catch (final Exception e) {
                throw new InterruptedException(e.getMessage());
            }
        }
    };
    server.setDispatcher(dispatcher);
}



public String getLastRequestPath() {
    return lastRequestPath;
}

public String getUrl() {
    return server.url("/").toString();
}

public int getLastResponseCode() {
    return lastResponseCode;
}


public void setDefaultDispatcher() {
    server.setDispatcher(new QueueDispatcher());
}


public void enqueueResponse(final MockResponse response) {
    server.enqueue(response);
}

public void shutdownServer() throws IOException {
    server.shutdown();
}

我执行仪器测试时的终点是“/”。

仅当我在代理网络后面时才会出现此问题,如果在我的移动设备中我切换到不在代理后面的另一个网络,则模拟服务器运行良好。知道我做错了什么吗?

编辑: 当我在代理后面时,调度员永远不会被调用

【问题讨论】:

    标签: android proxy okhttp android-instrumentation mockwebserver


    【解决方案1】:

    好吧,我最后才弄清楚.... 结果我的 okhttp3 客户端指向真正的代理服务器,而不是本地主机中的模拟 Web 服务器。我通过仅在测试 Flavor 时向我的 okhttp3 客户端添加代理然后将其添加到 Retrofit2 构建器来解决这个问题。代码如下所示。

    if (BuildConfig.TEST_PROXY){
                try {
                    InetSocketAddress sock = new InetSocketAddress(InetAddress.getByName("localhost"),12345);
                    builderOkhttpClient.proxy(new Proxy(Proxy.Type.HTTP, sock));
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
            }
    

    请务必注意,构建 InetSocketAddress 时的 端口mock web 服务器 端口相同。

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 1970-01-01
      • 2017-01-29
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多