मैं HttpStack नामित का एक उपवर्ग FakeHttpStack कि स्थानीय में रेस/कच्चे स्थित फ़ाइल से नकली प्रतिक्रिया शरीर लोड लागू किया। मैंने विकास के उद्देश्य के लिए यह किया है, यानी, मैं सर्वर तैयार होने से पहले नई एपीआई के लिए कुछ विकसित कर सकता हूं, लेकिन आप यहां से कुछ सीख सकते हैं (उदाहरण के लिए, एचटीपीस्टैक # 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 करने के लिए इसे पारित करने के लिए की है। मैं भी अनुरोधक्यूयू ओवरराइड करता हूं।
public class FakeRequestQueue extends RequestQueue {
public FakeRequestQueue(Context context) {
super(new NoCache(), new BasicNetwork(new FakeHttpStack(context)));
}
}
इस दृष्टिकोण के लिए अच्छा बिंदु यह है कि, आपको अपने कोड में बहुत अधिक परिवर्तन की आवश्यकता नहीं है। परीक्षण करने पर आपको बस RequestQueue से FakeRequestQueue स्विच करना होगा। इस प्रकार, इसे स्वीकृति परीक्षण या सिस्टम परीक्षण में उपयोग किया जा सकता है।
दूसरी ओर, यूनिट परीक्षण के लिए, अधिक कॉम्पैक्ट तरीका हो सकता है। उदाहरण के लिए, आप अपने अनुरोध। लिस्टर उप-वर्ग को अलग वर्ग के रूप में कार्यान्वित कर सकते हैं ताकि ऑनस्पॉन्स विधि को आसानी से परीक्षण किया जा सके। मैं आपको सलाह देता हूं कि आप क्या परीक्षण करना चाहते हैं या कुछ कोड खंड डालना चाहते हैं।
नकली प्रतिक्रिया के लिए मेरा समाधान FakeHttpStack बनाता है जो HttpStack लागू करता है। फिर आप RequestQueue को नए RequestQueue (नया NoCache(), नया बेसिकनेटवर्क (नया FakeHttpStack()) प्राप्त कर सकते हैं; – Kazuki
वर्तमान में शून्य दस्तावेज़ है जो मुझे मिल सकता है। लेकिन वहां बहुत सारे नमूने हैं और Google आईओ 2013 वीडियो भी खोदना आसान है। –
@ कज़ुकी क्या आप इसे उत्तर के रूप में छोड़ सकते हैं? अभी तक यह एकमात्र असली जवाब है। –