在使用 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);
原文由 Graham Smith 发布,翻译遵循 CC BY-SA 4.0 许可协议
retrofit.Response
类有静态工厂方法来创建实例:例如:
要么:
注意:在最新的 Kotlin Retrofit 版本(2.7.1)中,建议使用这样的扩展方法:
这属于 Effective Java Item 1: Consider static factory methods instead of constructors 。