gpt4 book ai didi

android - 如何在使用 Retrofit 2 进行单元测试期间创建一个 retrofit.Response 对象

转载 作者:IT老高 更新时间:2023-10-28 21:40:41 30 4
gpt4 key购买 nike

在使用 RxJava 和 Retrofit 2 时,我正在尝试创建单元测试来覆盖我的应用何时收到特定响应。

我遇到的问题是,在 Retrofit 2 中,我看不到在不使用反射的情况下创建 retrofit.Response 对象的好方法。

@Test
public void testLogin_throwsLoginBadRequestExceptionWhen403Error() {


Request.Builder requestBuilder = new Request.Builder();
requestBuilder.get();
requestBuilder.url("http://localhost");

Response.Builder responseBuilder = new Response.Builder();
responseBuilder.code(403);
responseBuilder.protocol(Protocol.HTTP_1_1);
responseBuilder.body(ResponseBody.create(MediaType.parse("application/json"), "{\"key\":[\"somestuff\"]}"));
responseBuilder.request(requestBuilder.build());

retrofit.Response<LoginResponse> aResponse = null;

try {
Constructor<retrofit.Response> constructor= (Constructor<retrofit.Response>) retrofit.Response.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
aResponse = constructor.newInstance(responseBuilder.build(), null, null);
} catch (Exception ex) {
//reflection error
}

doReturn(Observable.just(aResponse)).when(mockLoginAPI).login(anyObject());

TestSubscriber testSubscriber = new TestSubscriber();
loginAPIService.login(loginRequest).subscribe(testSubscriber);

Throwable resultError = (Throwable) testSubscriber.getOnErrorEvents().get(0);
assertTrue(resultError instanceof LoginBadRequestException);
}

我尝试使用以下方法,但这会创建 OkHttp 响应与改造响应。

    Request.Builder requestBuilder = new Request.Builder();
requestBuilder.get();
requestBuilder.url("http://localhost");

Response.Builder responseBuilder = new Response.Builder();
responseBuilder.code(403);
responseBuilder.protocol(Protocol.HTTP_1_1);

最佳答案

retrofit.Response类具有创建实例的静态工厂方法:

public static <T> Response<T> success(T body) {
/* ... */
}

public static <T> Response<T> success(T body, com.squareup.okhttp.Response rawResponse) {
/* ... */
}

public static <T> Response<T> error(int code, ResponseBody body) {
/* ... */
}

public static <T> Response<T> error(ResponseBody body, com.squareup.okhttp.Response rawResponse) {
/* ... */
}

例如:

Account account = ...;
retrofit.Response<Account> aResponse = retrofit.Response.success(account);

或者:

retrofit.Response<Account> aResponse = retrofit.Response.error(
403,
ResponseBody.create(
MediaType.parse("application/json"),
"{\"key\":[\"somestuff\"]}"
)
);

注意:在 Kotlin 的最新 Retrofit 版本(2.7.1)中,建议使用如下扩展方法:

Response.error(
400,
"{\"key\":[\"somestuff\"]}"
.toResponseBody("application/json".toMediaTypeOrNull())
)

这属于有效的 Java 项目 1:考虑静态工厂方法而不是构造函数

关于android - 如何在使用 Retrofit 2 进行单元测试期间创建一个 retrofit.Response 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33153100/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com