如何实现 MockWebServer 以使用代理
How to implement MockWebServer to work with proxy
我正在尝试从 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();
}
我执行仪器测试的终点是“/”。
只有当我在代理网络后面时才会出现此问题,如果在我的移动设备中切换到另一个不在代理后面的网络,则模拟服务器运行良好。知道我做错了什么吗?
编辑:
当我在代理后面时,调度员永远不会被调用
好吧,我最后才弄清楚....结果是我的 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 时的 port 与 mock web 服务器端口。
我正在尝试从 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();
}
我执行仪器测试的终点是“/”。
只有当我在代理网络后面时才会出现此问题,如果在我的移动设备中切换到另一个不在代理后面的网络,则模拟服务器运行良好。知道我做错了什么吗?
编辑: 当我在代理后面时,调度员永远不会被调用
好吧,我最后才弄清楚....结果是我的 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 时的 port 与 mock web 服务器端口。