Nel mio MainActivity
ho un metodo chiamato getAPI
che restituisce un OTBServiceWrapper
. Viene utilizzato per impostare il retrofit per la chiamata a un'API.Test Android: Retrofit di spegnimento con Mockito
Nel mio file MainActivityTest
Sto cercando di spegnere la new OTBService().getService()
chiamata che il metodo getApi
sta facendo in modo da poter restituire un MockedOTBService
che cambia il cliente a uno personalizzato che restituiscono json
.
Come è, l'implementazione corrente sarà il MockedOTBService
se dovessi inserire un logger entro MockedOTBService
ma anche rientra e chiama la vera api, che non è voglio che io voglia in un test.
Sto tentando di interrompere le chiamate all'API di Retrofit utilizzando Mockito e restituire json
. Non riesco a capire perché lo stub viene chiamato ancora non stubing il metodo in questione.
Note:
- sto usando
ActivityInstrumentationTestCase2
- Sto solo facendo funzionare un test
- Se posso aggiungere un
verify(mockedOTBService, atLeastOnce()).getService();
è dice che non è mai stato chiamato. - Se cambio il
when...thenReturn
per utilizzare unmMainActivity = spy(getActivity())
, non viene apportata alcuna modifica e viene richiamata la vera API.
Logcat uscita
Logger﹕ MockedOTBService was called // Mock is called
Logger﹕ Real OTBService was called // Real API is called
Logger﹕ MainActivity getAPI method class is "$Proxy1" // Mock is shown in MainActivity
Logger﹕ RealAPIResponse JSON Parsed ID: 266 // Real API response returned
reale portata
MainActivity.onCreate()> OTBService.getService()> OTBServiceWrapper.createSearch (...)
Cercando di raggiungere entro i test
MainActivity.onCreate()> MockedOTBService.getService()> OTBServiceWrapper.createSearch (...)
MainActivity.java
public class MainActivity extends Activity {
private OTBServiceWrapper serviceWrapper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getApi().createSearch(...)
}
public OTBServiceWrapper getApi() {
return new OTBService().getService();
}
}
OTBService.java
public class OTBService {
public OTBServiceWrapper getService() {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Constants.API_URL)
.build();
return restAdapter.create(OTBServiceWrapper.class);
}
}
OTBServiceWrapper.java
public interface OTBServiceWrapper {
@POST(Constants.API_SEARCHES_POST_URL)
void createSearch(@Body Request request, Callback<Request.Response> callback);
}
MainAc tivityTest.java
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
private OTBService mMockedOTBService;
private MainActivity mMainActivity;
private View mSearchButton;
public MainActivityTest() { super(MainActivity.class); }
@Override
protected void setUp() throws Exception {
super.setUp();
setActivityInitialTouchMode(true);
System.setProperty("dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath());
mMockedOTBService = mock(OTBService.class);
when(mMockedOTBService.getService()).thenReturn(new MockedOTBService(getInstrumentation().getContext()).getService());
mMainActivity = getActivity();
mSearchButton = mMainActivity.findViewById(R.id.AbSearchButton);
mYourHolidayButton = mMainActivity.findViewById(R.id.AbYourHolidayButton);
}
public void testButtonActions() {
TouchUtils.clickView(this, mSearchButton);
...
}
}
MockedOTBService.java
public class MockedOTBService {
private Context context;
public MockedOTBService(Context context) { this.context = context; }
public OTBServiceWrapper getService() {
RestAdapter restAdapter;
restAdapter = new RestAdapter.Builder()
.setClient(new LocalJsonClient(context))
.setEndpoint(Constants.API_TEST_URL)
.build();
return restAdapter.create(OTBServiceWrapper.class);
}
}
LocalJsonClient.java
@SuppressLint("DefaultLocale")
public class LocalJsonClient implements Client { ... }
build.gradle
dependencies {
androidTestCompile 'com.google.dexmaker:dexmaker:1.0'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0'
}