???????
????????????????? Iván Carballo?????????????????Espresso?? Mockito ??Dagger 2 ??д250??UI???????????????????????г?????
??????????????У???????????????Mockito?????????Mockito??java??д?????????????????Dagger 2 ?????????????Android UI??????????????????дAndroid?е?UI ?????????????????в????????????????????????????????
??????????????????????UI????????????????????Robotium?????????Robotium??android?е?????????????????????????????????????á????????????????????????????????????????????λ??????????????????????mocking????????????????????????????????????????????????????o???????????100???????????????40????????????????????????????????????????????????κδ???????????????????????????????????????????д???????????Щ???????????а?????????κ?????
??????????John Dewey??????????????????????
???????????????????????????????????????????????????
??????????????????????????????????????????API ?????????????????????????????????????????????????????????????????????????????????API??????????????????????????wifi?????????????????????????????????????????UI?????????????С??????????????API?????????????????????????integration tests??????ò?????????????????
????Mock?????????????
??????Mocking is the solution??
????Mock ????????????????mock?????????滻???????????????????????????????д????????????UI??????????????á????????????????????java???????Mockito ???????????Ч??????????????????????????????????????UserApi ????stub?????????stub?????“?”??????????????????????У????????μ???????????·??????????????????????????????????????????Ч?????????в????????????е????????????????????????????username???????顣
????class UsersApi {
????String[] getUserNames() { }
????}
????// Create the mock version of a UsersApi class
????UsersApi mockApi = Mockito.mock(UsersApi.class);
????// Stub the getUserNames() method
????when(mockApi.getUserNames())
????.thenReturn(new String[]{"User1"?? "User2"?? "User3"});
????// The call below will always return an array containing the
????// three users named above
????mockApi.getUserNames();
????????????????mock??????????????ò????????????????????????????????е?????????????????????????????????????????????ò?????????????test-friendly??????滻???????????????????????????????????ɡ?????????????????????????????????????????????檔???????????????????activity?????HttpURLConnection????REST API ????????????????????????????? ????????????????????????????
?????????????????????????????????????????2?????????mock?????????д??mock????????ò??????
?????????????????
????A test friendly architecture
???????????????????????????????????????????? ribot ???????? ????????????????????Android??ü?????????????????????????????????????κμ???С?????????????MVP?????????????UI??????????mock??????Model?????????????????????????????????д?????м????????????


MVP???

????DataManager??Model???б????Presenter???????????????????Model???????????滻???????
??????DataManger???ɡ?
???????Dagger???????DataManager
????Using Dagger to inject a mock DataManager
?????????????????????????????????????????????????????滻???????????????Dagger2 ?????????????Android?е????????????????????н????Dagger ????????????????????????????Dagger2 ?????????????? ????????????????????Dagger ??Module??Component???????????ApplicationComponent ??ApplicationModule????????????濴???????????????DataManger???????????????????????????????DataManager????????????@inject???????????????????????????????????????????????ApplicationComponent ??ApplicationModuleд???????????????
????@Module
????public class ApplicationModule {
????@Provides
????@Singleton
????public DataManager provideDataManager() {
????return mDataManager;
????}
????}
????@Singleton
????@Component(modules = ApplicationModule.class)
????public interface ApplicationComponent {
????DataManager dataManager();
????}
????????ApplicationComponent ??Application???г????:
????public class MyApplication extends Application {
????ApplicationComponent mApplicationComponent;
????public ApplicationComponent getComponent() {
????if (mApplicationComponent == null) {
????mApplicationComponent = DaggerApplicationComponent.builder()
????.applicationModule(new ApplicationModule(this))
????.build();
????}
????return mApplicationComponent;
????}
????// Needed to replace the component with a test specific one
????public void setComponent(ApplicationComponent applicationComponent) {
????mApplicationComponent = applicationComponent;
????}
????}
???????????ù?Dagger2?????????????????ò??裬?????????????????test?????????????Module??Component
????@Module
????public class TestApplicationModule {
????// We provide a mock version of the DataManager using Mockito
????@Provides
????@Singleton
????public DataManager provideDataManager() {
????return Mockito.mock(DataManager.class);
????}
????}
????@Singleton
????@Component(modules = TestApplicationModule.class)
????public interface TestComponent extends ApplicationComponent {
????// Empty because extends ApplicationComponent
????}
?????????TestApplicationModule???Mockito????????DataManger????TestComponent??ApplicationComponent???????????TestApplicationModule???module????????ApplicationModule???????ζ????????????????Application???г????TestComponent?????????DataManager????