OkHttp MockWebServer 使用 Retrofit 动态 URL
OkHttp MockWebServer with dynamic URLs using Retrofit
我的应用程序使用动态 URL 进行网络服务调用(Android)。 baseUrl 设置为空,我们在服务接口中传递 Retrofit2 @Url 参数:
public interface UserService {
@GET
public Call<ResponseBody> profilePicture(@Url String url);
}
我们事先不知道 host/domain,所以 MockWebServer 无法拦截请求。获取动态 URL 初始列表的调用是在不同的屏幕中进行的。一个想法是创建一种新风格,为要使用的 URL 提供本地数据源,这是我的后备计划。
我很好奇MockWebServer是否有任何其他方法来帮助测试这种情况并且可以限制为测试代码。
您可以使用 OkHttp 拦截器重写主机名和端口吗?
我也遇到了同样的问题。当我在测试中使用 MockWebserver 时,我必须更改 base URL 以定位模拟 Web 服务器本地主机和端口。我试过了,它工作正常。
private static final Interceptor mRequestInterceptor = new Interceptor() {
@Override
public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
final InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
HttpUrl httpUrl = request.url().newBuilder().scheme("http://").host(address.getHostName()).port(8080)
.build();
request = request.newBuilder()
.url(httpUrl)
.build();
return chain.proceed(request);
}
};
此基础后url变为“http://localhost:8080/”
我的应用程序使用动态 URL 进行网络服务调用(Android)。 baseUrl 设置为空,我们在服务接口中传递 Retrofit2 @Url 参数:
public interface UserService {
@GET
public Call<ResponseBody> profilePicture(@Url String url);
}
我们事先不知道 host/domain,所以 MockWebServer 无法拦截请求。获取动态 URL 初始列表的调用是在不同的屏幕中进行的。一个想法是创建一种新风格,为要使用的 URL 提供本地数据源,这是我的后备计划。
我很好奇MockWebServer是否有任何其他方法来帮助测试这种情况并且可以限制为测试代码。
您可以使用 OkHttp 拦截器重写主机名和端口吗?
我也遇到了同样的问题。当我在测试中使用 MockWebserver 时,我必须更改 base URL 以定位模拟 Web 服务器本地主机和端口。我试过了,它工作正常。
private static final Interceptor mRequestInterceptor = new Interceptor() {
@Override
public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
final InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
HttpUrl httpUrl = request.url().newBuilder().scheme("http://").host(address.getHostName()).port(8080)
.build();
request = request.newBuilder()
.url(httpUrl)
.build();
return chain.proceed(request);
}
};
此基础后url变为“http://localhost:8080/”