2015-11-18 6 views
3

У меня есть следующий объявление интерфейса:Хороший способ модульного тестирования Retorfit интерфейса декларации

public interface FundaService 
{ 
    @GET("/feeds/Aanbod.svc/json/{key}") 
    Observable<JsonResponse> queryData(@Path("key") String key, @Query("type") String type, @Query("zo") String search, @Query("page") int page, @Query("pagesize") int pageSize); 
} 

, что я использую после с Retrofit. Каким будет элегантный способ тестирования, чтобы я не ошибался в объявлениях URL и параметрах запроса?

Я вижу, что могу издеваться над веб-слоем и проверять URL-адреса с параметрами.

UPDATE

Я изменил его:

public interface FundaService 
{ 

    String KEY_PATH_PARAM = "key"; 
    String FEED_PATH = "/feeds/Aanbod.svc/json/{" + KEY_PATH_PARAM + "}"; 
    String TYPE_QUERY_PARAM = "type"; 
    String SEARCH_QUERY_PARAM = "zo"; 
    String PAGE_QUERY_PARAM = "page"; 
    String PAGESIZE_QUERY_PARAM = "pagesize"; 

    @GET(FEED_PATH) 
    Observable<JsonResponse> queryData(@Path(KEY_PATH_PARAM) String key, @Query(TYPE_QUERY_PARAM) String type, 
             @Query(SEARCH_QUERY_PARAM) String search, @Query(PAGE_QUERY_PARAM) int page, 
             @Query(PAGESIZE_QUERY_PARAM) int pageSize); 
} 

И частично испытывая его, как:

public class FundaServiceTest 
{ 
    @Test 
    public void PathKeyIsCorrect() 
     throws Exception 
    { 
     assertThat(FundaService.KEY_PATH_PARAM).isEqualTo("key"); 
    } 

    @Test 
    public void FeedPathIsCorrect() 
     throws Exception 
    { 
     assertThat(FundaService.FEED_PATH).isEqualTo("/feeds/Aanbod.svc/json/{key}"); 
    } 
} 

ответ

3

Вы можете использовать okhttp перехватчик для проверки окончательный запрос, построенный дооснащения без использования mock http-сервера. Это дает вам возможность проверить запрос раньше. Предположим, мы хотим проверить следующий интерфейс -

public interface AwesomeApi { 
    @GET("/cool/stuff") 
    Call<Void> getCoolStuff(@Query(("id"))String id); 
} 

validateEagerly` Первый тест беги», чтобы сделать проверку всего интерфейса. Полезно иметь, если ваши другие тестовые примеры не касаются всех методов интерфейса. Второй тест - пример того, как вы можете проверить, что конкретный вызов генерирует ожидаемый URL.

public class AwesomeApiTest { 

    @Test 
    public void testValidInterface() { 
    Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("http://www.example.com/") 
     .addConverterFactory(GsonConverterFactory.create()) 
     // Will throw an exception if interface is not valid 
     .validateEagerly() 
     .build(); 
    retrofit.create(AwesomeApi.class); 
    } 

    @Test(expected = NotImplementedException.class) 
    public void testCoolStuffRequest() throws Exception { 
    OkHttpClient client = new OkHttpClient(); 
    client.interceptors().add(new Interceptor() { 
     @Override 
     public com.squareup.okhttp.Response intercept(Chain chain) throws IOException { 
     final Request request = chain.request(); 
     // Grab the request from the chain, and test away 
     assertEquals("HTTP methods should match", "GET", request.method()); 
     HttpUrl url = request.httpUrl(); 
     // Test First query parameter 
     assertEquals("first query paramter", "id", url.queryParameterName(0)); 
     // Or, the whole url at once -- 
     assertEquals("url ", "http://www.example.com/cool/stuff?id=123", url.toString()); 
     // The following just ends the test with an expected exception. 
     // You could construct a valid Response and return that instead 
     // Do not return chain.proceed(), because then your unit test may become 
     // subject to the whims of the network 
     throw new NotImplementedException(); 
     } 
    }); 
    Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("http://www.example.com/") 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(client) 
     .build(); 
    AwesomeApi awesomeApi = retrofit.create(AwesomeApi.class); 
    awesomeApi.getCoolStuff("123").execute();; 
    } 
} 

Я получил эту идею от просмотра собственных тестов модифицированного оборудования. Тесты других людей часто являются большим источником вдохновения!

+0

Спасибо! Я собираюсь попробовать сегодня и приму ответ –

Смежные вопросы