Я пишу тест пользовательского интерфейса, который включает в себя 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 есть проблемы