Как создать объект retrofit.Response во время модульного тестирования с помощью дооснащения 2

При использовании RxJava и Retrofit 2 я пытаюсь создать Unit Tests для покрытия, когда мое приложение получает конкретные ответы.

Проблема у меня в том, что с 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 Response и RetoFit Response.

  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); 

Solutions Collecting From Web of "Как создать объект retrofit.Response во время модульного тестирования с помощью дооснащения 2"

Класс 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\"]}" ) ); 

Это подпадает под Эффективный Java. Пункт 1: Рассмотрите статические заводские методы вместо конструкторов .