2014-04-07 14 views
8

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

  • çalıştırıyorum ActivityInstrumentationTestCase2
  • kullanıyorum

    1. .
    2. Bir mMainActivity = spy(getActivity()) kullanmak için when...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' 
    } 
    
  • cevap

    6

    hizmet alanlarını belirleme Aktivite izin vererek isteğinizi alay ihtiyacını kaldırın.

    MainActivity hizmetinizde, bir sınıf değişkeni ve hizmet için bir sınıf belirleyici oluşturun. Hizmetin olmasını istediğiniz yere koymadan önce, OnCreate yönteminin çağrılmasını engellemek için sınıf kapsamında olması gerekir. Ayrıca, henüz yapmadıysanız hizmeti ayarlayan bir örnek alma aracı oluşturun.

    getActivity() numaralı telefonu aramadan önce yaptığınız testte, hizmeti sahte servisiniz olarak ayarlayın. (Belki bunu bir destek nesnesine taşımayı düşünün).

    MainActivity.java

    public class MainActivity extends Activity { 
        private static OTBServiceWrapper serviceWrapper; 
    
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        getServiceWrapper.createSearch(...) 
        } 
    
        public OTBServiceWrapper getServiceWrapper() { 
        if (serviceWrapper == null) { 
         MainActivity.setServiceWrapper(new OTBService().getService()); 
        } 
    
        return serviceWrapper; 
        } 
    
        public static void setServiceWrapper(OTBServiceWrapper serviceWrapper) { 
        MainActivity.serviceWrapper = serviceWrapper; 
        } 
    } 
    

    MainActivityTest.java

    public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { 
        private MainActivity mMainActivity; 
    
        public MainActivityTest() { super(MainActivity.class); } 
    
        @Override 
        protected void setUp() throws Exception { 
        super.setUp(); 
    
        setActivityInitialTouchMode(true); 
    
        MainActivity.setServiceWrapper(
         new MockedOTBService(getInstrumentation().getContext()).getService() 
        ); 
    
        mMainActivity = getActivity(); 
        } 
    }