2014-06-30 11 views
7

Chciałbym symulować komunikację sieciową przez MockWebServer. Unfortulatelly retrofit callbacks nigdy nie wywołują. Mój kod:MockWebServer i Retrofit z oddzwonieniem

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

Kiedy używam retrofitu bez wywołań zwrotnych, to działa.

+0

Czy musisz załączyć swój oddzwaniacz * ZANIM * wykonujesz 'server.play()'? – Blundell

+1

Kiedy zmieniam kolejność, powoduje to wyjątek java.lang.IllegalStateException: Nie można pobrać portu przed wywołaniem gry() – lukjar

Odpowiedz

12

Po wprowadzeniu Callback mówisz Retrofit, aby wywołać żądanie i asynchronicznie wywołać wywołanie zwrotne. Oznacza to, że twój test kończy się, zanim cokolwiek się stanie.

Istnieją dwa sposoby, aby uzyskać to do pracy:

  • użyć blokady na końcu badania i czekać, aż jedna z metod zwrotnych są wywoływane.
  • Przepuścić instancji synchronicznego Executor (taki, który po prostu wywołuje .run() natychmiast) do setExecutors na RestAdapter.Builder tak, że wywołania tła i wywołania oddzwonienia zdarzyć synchronicznie.
+0

Dzięki +1, dostarczanie synchronicznych 'executorów' działa świetnie. Czy blokada nie zablokuje głównego wątku, a zatem nie pozwoli na wykonywanie wywołań zwrotnych (w głównym wątku), a zatem blokada nigdy nie zostanie zwolniona? Przez "blokadę" myślę o czymś w rodzaju "CountDownLatch" – Dori

+0

Nie działa to z modernizacją 2. Jak sprawić, by działał w Retroficie 2? –

Powiązane problemy