2014-06-30 17 views
7

Ich möchte Netzwerkkommunikation von MockWebServer simulieren. Leider werden Retrofit-Callbacks nie aufgerufen. Mein Code:MockWebServer und Retrofit mit Callback

MockWebServer server = new MockWebServer(); 
    server.enqueue(new MockResponse().setResponseCode(200).setBody("{}")); 
    server.play(); 

    RestAdapter restAdapter = new RestAdapter.Builder().setConverter(new MyGsonConverter(new Gson())) 
      .setEndpoint(server.getUrl("/").toString()).build(); 

    restAdapter.create(SearchService.class).getCount(StringUtils.EMPTY, 
      new Callback<CountContainer>() { 

       @Override 
       public void success(CountContainer countContainer, Response response) { 
        System.out.println("success"); 
       } 

       @Override 
       public void failure(RetrofitError error) { 
        System.out.println("error"); 
       } 
      }); 

    server.shutdown(); 

Wenn ich Retrofit ohne Rückrufe verwende, funktioniert es.

+0

Müssen Sie Ihren Rückruf anhängen * VOR * Sie tun 'server.play()'? – Blundell

+1

Wenn ich die Reihenfolge ändere, löst dies die Ausnahme java.lang.IllegalStateException aus: Port kann vor dem Aufruf von play nicht abgerufen werden() – lukjar

Antwort

12

Mit einem Callback sagen Sie Retrofit, die Anfrage aufzurufen und den Rückruf asynchron aufzurufen. Dies bedeutet, dass der Test beendet wird, bevor etwas passiert.

Es gibt zwei Möglichkeiten, dies zu Arbeit zu bekommen:

  • ein Schloss am Ende des Tests verwenden und warten, bis eine der Rückrufmethoden aufgerufen werden.
  • Übergeben Sie eine Instanz einer synchronen Executor (eine, die .run() sofort aufruft) an setExecutors auf der RestAdapter.Builder, damit die Hintergrundaufrufe und Callbackaufrufe synchron erfolgen.
+0

+1 Danke, die synchronen 'Executors' zu liefern funktioniert großartig. Würde eine Sperre den Haupt-Thread nicht blockieren und daher nicht erlauben, dass die Callbacks ausgeführt werden (auf dem Haupt-Thread) und daher die Sperre niemals freigegeben wird? Durch 'Sperren' im Denken von so etwas wie 'CountDownLatch' – Dori

+0

Dies funktioniert nicht mit Retrofit 2. Wie mache ich es in Retrofit 2 arbeiten? –