Эспрессо не будет ждать ложного отклика с пользовательским перехватчиком - PullRequest
0 голосов
/ 11 мая 2018

Я пишу тест пользовательского интерфейса, который включает в себя Espresso и Retrofit. Мой эспрессо не будет ждать, пока мой фальшивый API выведет все данные, прежде чем нажимать следующую кнопку.

Я создал собственный класс, подобный этому, чтобы сделать ложный ответ:

public class FakeInterceptor implements Interceptor {

private final static String TAG = FakeInterceptor.class.getSimpleName();

// FAKE JSON RESPONSES.
private final static String PROFILE__USER_RECOMMENDS = JsonDataSource.jsonUserRecommends;
private final static String PROFILE__USER = JsonDataSource.jsonUser;


@Override
public Response intercept(Chain chain) throws IOException {
    Response response;
    String responseString = "";
    // Get Requested link.
    String requestedPath = chain.request().url().encodedPath();

    if (requestedPath.equalsIgnoreCase("api/users/profile/recommendsTab")) {
        responseString = PROFILE__USER_RECOMMENDS;
    } else if (requestedPath.equalsIgnoreCase("api/users/me")) {
        responseString = PROFILE__USER;
    }

    response = new Response.Builder()
            .code(200)
            .message(responseString)
            .request(chain.request())
            .protocol(Protocol.HTTP_1_0)
            .body(ResponseBody.create(MediaType.parse("application/json"), responseString.getBytes()))
            .addHeader("content-type", "application/json")
            .build();

    return response;
}
}

Однако проблема возникает, когда я использую экземпляр модификации с этим FakeInterceptor с эспрессо.

OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new FakeInterceptor()).build();

и сборка модифицированного экземпляра

retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(JsonUtils.getInstance().getGson()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl(Constants.END_POINT)
                .client(okHttpClient)
                .build();

Когда я использую perform(click()) для onView, например:

onView(withId(R.id.button_1)).perform(click());
onView(withId(R.id.button_2)).perform(click());
onView(withId(R.id.button_3)).perform(click());

(Имейте в виду, что каждая кнопка изменяет фрагмент, и каждый фрагмент загружает API для отображения данных). Кнопка нажимается непрерывно, данные не могут быть показаны.

Но если я не использую addInterceptor(new FakeInterceptor()) и позволю модернизировать вызов реального API, каждый щелчок ожидает API, позволяет отображать данные до нажатия следующей кнопки.

Вот как я называю фиктивный API

 @Mock
UserRepository userRepository;

UserRepository mockUserRepository;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);

    appContext = InstrumentationRegistry.getTargetContext();
    mockUserRepository = Injection.provideUserRepository(appContext); // This mockUserRepository will use the retrofit instance with `FakeInterceptor`

    Mockito.when(userRepository.getUserInfo()).thenReturn(mockUserRepository.getUserInfo()); //Use the mock repository if the real user repository is called.
}

Я не знаю, пропущу ли я что-то в FakeInterceptor, что заставит эспрессо думать, что я использую настоящий API, а не поддельный.

Любая помощь в том, как заставить эспрессо ждать API, приветствуется.

Спасибо за ваше время!

UPDATE

Я поставил точку останова на responseString = PROFILE__USER, которая должна срабатывать, если вызывается mockUserRepository.getUserInfo(), но никогда не вызывается. Так как весь метод intercept(Chain chain) выглядит так, у этого FakeInterceptor есть проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...