Я работаю над написанием очень простых инструментальных тестов на основе Retrofit2 в Android (задача connectedTestAndroid).
Однако мои тесты не проходят из-за короткого сообщения об ошибке, приведенного выше.
Вот примеркод, который я использую:
package com.example.app.android;
import okhttp3.ResponseBody;
import okhttp3.OkHttpClient;
import java.util.concurrent.TimeUnit;
import java.io.IOException;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import android.util.Log;
public class Retrofit2Requests extends BasicRequest
{
private Call<ResponseBody> call;
private OkHttpClient _client;
private String _baseUrl;
private Retrofit2Adapter _adapter;
private static final String LOG_TAG = "RetroFit2Requests";
public Retrofit2Requests (String baseUrl) throws Exception
{
_client = new OkHttpClient
.Builder()
.connectTimeout(TIME_SOCKET_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(TIME_CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)
.build();
_adapter = (Retrofit2Adapter) new Retrofit.Builder()
.client(_client)
.baseUrl(baseUrl)
.build()
.create(Retrofit2Adapter.class);
_baseUrl = baseUrl;
}
public void getResponse(String data) throws IOException
{
Call<ResponseBody> call = _adapter.getDelayResponse(50, data);
call.enqueue(getCallback());
}
private Callback getCallback()
{
return new Callback<ResponseBody>()
{
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response)
{
ResponseBody responseBody = (ResponseBody) response.body();
Log.d(LOG_TAG, "ResponseBody: " + responseBody.toString());
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t)
{
Log.e(LOG_TAG, "An exception occured fetchign response...", t);
}
};
}
}
Цель этого кода - не проверять какую-либо бизнес-логику или что-то особенное в моем приложении.Все, что он должен сделать, это попытаться выполнить запрос, и все.
Вот также мои зависимости Gradle.Основываясь на выводе ./gradlew :app:dependencies
, я также убрал все возможные проблемы, связанные с различными версиями дооснащения в одном месте.Приложение не использует запутывание или минимизацию, поскольку, опять же, оно должно выполнять только сетевой запрос.
dependencies {
compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'org.apache.commons:commons-lang3:3.7'
compile 'com.squareup.retrofit2:retrofit:2.4.0'
compile 'com.android.support:multidex:1.0.1'
androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'junit:junit:4.12'
}
Если вам интересно, да, я делаю то же самое с несколькими сетевыми библиотеками.,Их существование, кроме случаев создания этих сборок NoClassDefFoundException, не должно иметь значения.Ранее я также явно зависел от OkHttp напрямую, но так как от него зависит retrofit2, я, естественно, пропустил эту зависимость.
Вот defaultConfig для моего приложения для Android:
defaultConfig {
applicationId 'com.example.app.android'
minSdkVersion 16
targetSdkVersion 24
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
dexOptions {
preDexLibraries true
javaMaxHeapSize '6g'
incremental true
}
}
Я смог, путемдекомпилируем отладочный APK, чтобы увидеть, что retrofit2 / Retrofit.class не был доступен.Это сбивает с толку, так как, насколько я понимаю, Дексинг не должен на это влиять.
Есть идеи, что может стать источником этой проблемы и решить в этом контексте?
Заранее спасибо,
Андреас.