2013-09-04 7 views
31

के साथ यूनिट परीक्षण मैं जानना चाहता हूं कि मैं वॉली फ्रेमवर्क के लिए यूनिट परीक्षण कैसे बना सकता हूं। अनुरोधों को मॉक करें, प्रतिक्रियाएं ताकि मैं यूनिट परीक्षण बना सकूं जिसके लिए वेबसाइकिल की कामकाजी और नेटवर्क पहुंच की आवश्यकता नहीं होती है।एंड्रॉइड वॉली

मैं इसे googled है, लेकिन मैं सभी

+2

नकली प्रतिक्रिया के लिए मेरा समाधान FakeHttpStack बनाता है जो HttpStack लागू करता है। फिर आप RequestQueue को नए RequestQueue (नया NoCache(), नया बेसिकनेटवर्क (नया FakeHttpStack()) प्राप्त कर सकते हैं; – Kazuki

+0

वर्तमान में शून्य दस्तावेज़ है जो मुझे मिल सकता है। लेकिन वहां बहुत सारे नमूने हैं और Google आईओ 2013 वीडियो भी खोदना आसान है। –

+0

@ कज़ुकी क्या आप इसे उत्तर के रूप में छोड़ सकते हैं? अभी तक यह एकमात्र असली जवाब है। –

उत्तर

0

नहीं 100% यकीन है कि मैं समझता हूँ कि आप क्या करना चाहते हैं, लेकिन अगर मैं करते हैं, तो (एक lib easymock पर ढांचे के बारे में ज्यादा जानकारी नहीं पाते हैं कि नकली कक्षाओं के निर्माण की अनुमति देता है, कि आप पूर्व निर्धारित प्रतिक्रियाओं को कॉल कर सकते हैं और प्राप्त कर सकते हैं) आपको बहुत मदद करेंगे। लार्स वोगल नामक एक लड़के के पास इस विषय पर एक अच्छा लेख है कि मैंने इसे थोड़ी देर पहले उपयोगी पाया जब मैंने इसका इस्तेमाल किया।

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

8

वॉली tests फ़ोल्डर पर एक नजर डालें, वहाँ आप उदाहरण मिल सकते हैं।

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

स्रोत का लिंक मर चुका है। – Greyson

+0

@Greyson अद्यतन लिंक। –

20

मैं 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 स्विच करना होगा। इस प्रकार, इसे स्वीकृति परीक्षण या सिस्टम परीक्षण में उपयोग किया जा सकता है।

दूसरी ओर, यूनिट परीक्षण के लिए, अधिक कॉम्पैक्ट तरीका हो सकता है। उदाहरण के लिए, आप अपने अनुरोध। लिस्टर उप-वर्ग को अलग वर्ग के रूप में कार्यान्वित कर सकते हैं ताकि ऑनस्पॉन्स विधि को आसानी से परीक्षण किया जा सके। मैं आपको सलाह देता हूं कि आप क्या परीक्षण करना चाहते हैं या कुछ कोड खंड डालना चाहते हैं।

+0

आप FakeRequestQueue देने के लिए Volley.java का विस्तार कर सकते हैं और newRequestQueue() को ओवरराइड कर सकते हैं। यदि आप निर्भरता इंजेक्शन का उपयोग करते हैं तो आप डिफ़ॉल्ट Volley.java के बजाय अपने MyVolley.java को इंजेक्ट कर सकते हैं ताकि आपके ऐप कोड को परीक्षण के लिए किसी भी बदलाव की आवश्यकता न हो। – Christine

+0

क्या आप मुझे यूनिट परीक्षण वॉली अनुरोध के लिए प्रतिक्रिया का नकल करने के लिए मार्गदर्शन कर सकते हैं। – Dory

+0

हैलो, मैंने fakeRequestQueue लागू किया है, लेकिन यह कोई प्रतिक्रिया नहीं दे रहा है। यहां एक नज़र डालें http://stackoverflow.com/questions/32623129/android-studio-unit-test-issues-in-writing-mock-tests-for-volley-request-fini – Dory

संबंधित मुद्दे