2014-04-07 19 views
8

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:

  1. sto usando ActivityInstrumentationTestCase2
  2. Sto solo facendo funzionare un test
  3. Se posso aggiungere un verify(mockedOTBService, atLeastOnce()).getService(); è dice che non è mai stato chiamato.
  4. Se cambio il when...thenReturn per utilizzare un mMainActivity = 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' 
} 

risposta

6

eliminare la necessità di beffardo la richiesta, consentendo l'attività per impostare il servizio.

Nel tuo MainActivity creare una variabile di classe e un setter di classe per il servizio. Deve essere un ambito di classe per evitare che il metodo OnCreate venga chiamato prima di aver impostato il servizio su ciò che si desidera che sia. Crea anche un getter di istanza che imposta il servizio se non lo hai già fatto.

Nel test, prima di chiamare getActivity(), impostare il servizio come servizio di simulazione. (Forse pensa di trasferirlo su un oggetto di supporto).

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(); 
    } 
}