Я пишу тесты пользовательского интерфейса для приложения, которое ожидает, что полезная нагрузка JSON будет доставлена в ответ на запрос, сделанный с помощью асинхронного вызова, который запускается кнопкой в тестируемом действии. Я намерен предоставить различные фиктивные полезные нагрузки, чтобы установить состояние этой активности и утвердить различные элементы в пользовательском интерфейсе.
Мне не повезло с тем, чтобы диспетчер перехватил запрос, сделанный через асинхронный вызов.
Асинхронный вызов выполняется в классе внутри модуля, который зависит от времени компиляции моего приложения, и я чувствую, что именно в этом заключается моя проблема, и я даже не уверен, выходит ли это за рамки возможностей Espresso.
@Before
public void setup() throws Exception {
server = new MockWebServer();
server.start();
// setting API in my production code to the MockWebServer
settingsProvider.setWebServiceURL(server.url("/").toString());
server.setDispatcher(new Dispatcher() {
@Override
public MockResponse dispatch(RecordedRequest recordedRequest) throws InterruptedException {
if (recordedRequest.getPath().startsWith("/v1/customers")) {
return new MockResponse().setResponseCode(200).setBody(JSONstring);
}
return new MockResponse().setResponseCode(204);
}
});
}
Если я делаю тестовый запрос из своего фактического теста, он работает:
@Before
public void testGet(){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(server.url("/v1/customers").toString()).build();
Log.d(LOG_TAG, "Test send GET " + request);
try {
Response response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
}
Добавив журналы, я убедился, что мой URL-адрес API задан правильно и является тем же портом, что и MockWebServer. В настоящее время приложение не использует инъекцию зависимостей.
Основная часть асинхронного вызова:
public void makeAsyncCall(final Application ctx , final AsyncWebServiceRequest request, final ResponseListenerInterface rli){
final AsyncWebServiceResponseListener listener = new AsyncWebServiceResponseListener(ctx, request, rli);
IntentFilter responseIntent = new IntentFilter(CommsActions.SEND);
responseIntent.addCategory(request.getMessageType());
ctx.registerReceiver(listener, responseIntent);
try {
ctx.startService(intent);
} catch (Exception e) {
Log.e(LOG_TAG , Log.getStackTraceString(e));
);
}
}
Цените любой вклад.