Групповое тестирование с Android-залпом

Я хотел бы знать, как я могу создать модульные тесты для платформы volley. Измените запросы, ответы, чтобы я мог создавать модульные тесты, которые не требуют работы веб-службы и сетевых доступов.

Я googled, но я не нахожу много информации о структуре вообще

Solutions Collecting From Web of "Групповое тестирование с Android-залпом"

Я реализовал подкласс HttpStack с именем FakeHttpStack, который загружает тело фальшивого ответа из локального файла, расположенного в res / raw. Я сделал это для целей разработки, т. Е. Я могу разработать что-то для нового API до того, как сервер будет готов, но вы можете узнать что-то (например, переопределить HttpStack # peformRequest и createEntity).

/** * Fake {@link HttpStack} that returns the fake content using resource file in res/raw. */ class FakeHttpStack implements HttpStack { private static final String DEFAULT_STRING_RESPONSE = "Hello"; private static final String DEFAULT_JSON_RESPONSE = " {\"a\":1,\"b\":2,\"c\":3}"; private static final String URL_PREFIX = "http://example.com/"; private static final String LOGGER_TAG = "STACK_OVER_FLOW"; private static final int SIMULATED_DELAY_MS = 500; private final Context context; FakeHttpStack(Context context) { this.context = context; } @Override public HttpResponse performRequest(Request<?> request, Map<String, String> stringStringMap) throws IOException, AuthFailureError { try { Thread.sleep(SIMULATED_DELAY_MS); } catch (InterruptedException e) { } HttpResponse response = new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "OK")); List<Header> headers = defaultHeaders(); response.setHeaders(headers.toArray(new Header[0])); response.setLocale(Locale.JAPAN); response.setEntity(createEntity(request)); return response; } private List<Header> defaultHeaders() { DateFormat dateFormat = new SimpleDateFormat("EEE, dd mmm yyyy HH:mm:ss zzz"); return Lists.<Header>newArrayList( new BasicHeader("Date", dateFormat.format(new Date())), new BasicHeader("Server", /* Data below is header info of my server */ "Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e") ); } /** * returns the fake content using resource file in res/raw. fake_res_foo.txt is used for * request to http://example.com/foo */ private HttpEntity createEntity(Request request) throws UnsupportedEncodingException { String resourceName = constructFakeResponseFileName(request); int resourceId = context.getResources().getIdentifier( resourceName, "raw", context.getApplicationContext().getPackageName()); if (resourceId == 0) { Log.w(LOGGER_TAG, "No fake file named " + resourceName + " found. default fake response should be used."); } else { InputStream stream = context.getResources().openRawResource(resourceId); try { String string = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8)); return new StringEntity(string); } catch (IOException e) { Log.e(LOGGER_TAG, "error reading " + resourceName, e); } } // Return default value since no fake file exists for given URL. if (request instanceof StringRequest) { return new StringEntity(DEFAULT_STRING_RESPONSE); } return new StringEntity(DEFAULT_JSON_RESPONSE); } /** * Map request URL to fake file name */ private String constructFakeResponseFileName(Request request) { String reqUrl = request.getUrl(); String apiName = reqUrl.substring(URL_PREFIX.length()); return "fake_res_" + apiName; } } 

Чтобы использовать FakeHttpStack, вам просто нужно передать его в RequestQueue . Я тоже переопределяю RequestQueue.

 public class FakeRequestQueue extends RequestQueue { public FakeRequestQueue(Context context) { super(new NoCache(), new BasicNetwork(new FakeHttpStack(context))); } } 

Хорошим моментом для этого подхода является то, что он не требует значительных изменений в коде. При тестировании вам просто нужно переключить RequestQueue на FakeRequestQueue . Таким образом, его можно использовать при приемочных испытаниях или системных испытаниях.

С другой стороны, для модульного тестирования может быть более компактным. Например, вы можете реализовать свой подкласс Request.Listener как отдельный класс, чтобы метод onResponse мог быть легко протестирован. Я рекомендую вам более подробно рассказать о том, что вы хотите проверить или поместить фрагмент кода.

Взгляните на папку пробных проб , там вы можете найти примеры.

 MockCache.java MockHttpClient.java MockHttpStack.java MockHttpURLConnection.java MockNetwork.java MockRequest.java MockResponseDelivery.java 

Не 100% уверены, что я понимаю, что вы хотите сделать, но если я это сделаю, то easymock (lib, который позволяет создавать макетные классы, которые вы можете совершать вызовы и получать предопределенные ответы) поможет вам многое. У парня под названием Lars Vogel есть хорошая статья по этой теме, которую я нашел полезным некоторое время назад, когда я его использовал.

http://www.vogella.com/articles/EasyMock/article.html