2016-07-02 5 views
3

Der Versuch, eine Retrofit 2.0 Response Einheit mit MockWebServer Einheit testen. Ich habe den Webserver Setup, aber das Problem tritt auf, wenn ich versuche, eine falsche json Datei als Antwort zu übergeben. Zur Veranschaulichung meine Ordnerstruktur ist:MockWebserver und Retrofit 2.0

src->test->java->package_name->class_name.java 

src->test->resources->list_success.json 

My Unit-Test:

@Before 
public void setUp() throws Exception{ 
    MockitoAnnotations.initMocks(this); 
    server = new MockWebServer(); 
    serviceHelper = new ServiceHelper(); 

} 
@Test 
public void testEventBusIdPostedOnSuccessfulServiceCall() throws Exception { 
    server.start(); 
    server.enqueue(new MockResponse().setResponseCode(200).setBody(getStringFromFile(RuntimeEnvironment.application, "list_success.json"))); 
    MainActivity.URL = server.url("/").toString(); 

    serviceHelper.getIndividualData("Store","7"); 
    verify(eventBus).post(any()); 
} 

@After 
public void tearDown() throws Exception{ 
    server.shutdown(); 
} 

Alles funktioniert gut. Der Nachrüstruf, der asynchron ist, wird mit dem Schein-JSON ausgelöst. Der Rückruf wird jedoch nie ausgelöst. Ich habe versucht, ein Countdown-Latch innerhalb der tatsächlichen Service-Implementierung zu setzen, aber auch nichts passiert.

public void getIndividualData(String item, String number) { 

      Call<DataList> dataList = RestClient.get().getList(item, number); 
      dataList.enqueue(new Callback<DataList>() { 
       @Override 
       public void onResponse(Response<DataList> response, Retrofit retrofit) { 
        /*data persistence should take place before sending out the eventbus message. 
        Passing the response object directly for sample purpose. */ 
        EventBus.getDefault().post(new IndividualItemEvent(response.body().Values)); 
       // latch.countDown(); ---->might be needed for retrofit async unit testing 
       } 

       @Override 
       public void onFailure(Throwable t) { 
        Log.d("%%%%%", "retrofit failure"); 
        // latch.countDown(); ---->might be needed for retrofit async unit testing 
       } 
      }); 
//  try { 
//   latch.await(); 
//  } catch (InterruptedException e) { ---->might be needed for retrofit async unit testing 
//   e.printStackTrace(); 
//  } 

Fehlt mir hier etwas? Danke.

+0

zu schaffen „sendet eine Otto Bus Ereignismeldung out“ - AFAIK, das wird nicht funktionieren, es sei denn, Sie verspotten werden all das auch. Otto benötigt Android; Dies kann insbesondere die Ursache für den Fehler "getMainLooper()" sein. – CommonsWare

+0

Das größere Problem ist mehr, wie man Retrofit mit mockwebserver prüft, während man eine statische JSON-Datei hat. Der otto-bus-Fehler endete als Nebenprodukt beim Versuch, das statische JSON-Problem zu umgehen, das ich ignorieren kann. – user2511882

+0

"Das größere Problem ist mehr, wie man Retrofit mit mockwebserver testet, während man eine statische JSON-Datei hat" - schlägt mich. Ich setze Instrumentierungstests ein und weiche lokalen Tests aus. Es tut uns leid! – CommonsWare

Antwort