使用Android volley进行unit testing

我想知道如何为排除框架创buildunit testing。 嘲笑请求,响应,以便我可以创buildunit testing,不需要Web服务工作和networking访问。

我GOOGLE了,但我根本没有find关于框架的很多信息

Solutions Collecting From Web of "使用Android volley进行unit testing"

我实现了一个名为FakeHttpStackHttpStack子类, 从位于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))); } } 

这种方法的好处是,它不需要你的代码有太多的改变。 testing时,您只需将您的RequestQueue切换到FakeRequestQueue 。 因此,它可以用于验收testing或系统testing。

另一方面,对于unit testing,可能会有更紧凑的方式。 例如,你可以实现你的Request.Listener子类作为单独的类,这样的onResponse方法可以很容易地testing。 我build议你把你想testing或放一些代码片段的更多细节。

看看排球testing文件夹,在那里你可以find例子。

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

不是100%确定我明白你想要做什么,但是如果我这样做,那么easymock(一个允许创build模拟类的库,可以调用并接收预定的响应)将帮助你很多。 一个名叫拉尔斯·沃格尔(Lars Vogel)的人在这个话题上有一篇很好的文章,当我使用它的时候,我发现它很有用。

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