MainActivity
'umda getAPI
isimli bir OTBServiceWrapper
döndüren bir yöntem var. Bu, bir API'yi çağırmak için uyarlamayı ayarlamak için kullanılır. Benim MainActivityTest
dosyasındaAndroid Testleri: Mockito ile Güçlendirme Uygulaması
Ben getApi
yöntem yüzden json
dönmek özel biri müşteri değiştiren bir MockedOTBService
dönebilirsiniz yapmakta olduğunu new OTBService().getService()
çağrıyı saplama için çalışıyorum. MockedOTBService
içinde bir kaydediciyi yerleştirmek zorunda kaldım, ancak aynı zamanda bir testte kullanmak istemediğim gerçek api'yi çağırır ve çağırırsa, şimdiki uygulama MockedOTBService
olacaktır.
Mockito kullanarak Retrofit API çağrılarını koymayı denedim ve json
'u döndürmeye çalışıyorum. Saplamanın neden çağrıldığını henüz anlayamıyorum, söz konusu yöntemi yormamaktır.
Notlar: Ben verify(mockedOTBService, atLeastOnce()).getService();
o hiç çağrılmadı diyor olduğunu eklerseniz sadece bir testi
ActivityInstrumentationTestCase2
- .
- Bir
mMainActivity = spy(getActivity())
kullanmak içinwhen...thenReturn
değiştirirseniz, değiştirilmez ve gerçek API çağrılır.
Logcat Çıktı
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
Gerçek Akış
MainActivity.onCreate()> OTBService.getService()> OTBServiceWrapper.createSearch (...)
Testlerine Erişmeye Çalışmak
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'
}