2012-01-24 37 views
20

मैं Fitnesse फ्रेमवर्क का उपयोग करके एक परीक्षण स्थिरता बनाने की कोशिश कर रहा हूं, और मैं एक ऐसे फ़ंक्शन का परीक्षण करना चाहता हूं जो सर्वर (रीस्टफुल सेवा) से डेटा पुनर्प्राप्त करे। यहाँत्रुटि java.lang.RuntimeException: स्टब! फिटनेस परीक्षण के साथ एंड्रॉइड में

public class FriendListActivityFixture extends ColumnFixture { 
    public int URL; 
    public String test() { 
    JSONArray array = JsonHelper.getJsonArrayFromUrl("http://107.22.209.62/android/get_users.php"); 
    return array.toString(); 
    } 
} 

public static JSONArray getJsonArrayFromUrl(String url) { 
     InputStream input = null; 
     String result = ""; 
     JSONArray jsonArray = null; 
     try { 
      HttpClient httpclient = CustomHttpClient.getHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      input = entity.getContent(); 
     } 
     catch (Exception e) { 
      Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error in http connection " + e.toString()); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(input, "iso-8859-1"), 8); 
      StringBuilder content = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       content.append(line + "\n"); 
      } 
      input.close(); 
      result = content.toString(); 
     } 
     catch (Exception e) { 
      Log.e(TAG + ".getJsonArrayFromUrl(String url)", "Error parsing result " + e.toString()); 
     } 

     try { 
      jsonArray = new JSONArray(result); 
     } 
     catch (JSONException e) { 
      Log.e(TAG + "getJsonArrayFromUrl(String url)", "Error converting data " + e.toString()); 
     } 
     return jsonArray; 
    } 

और Fitnesse परीक्षण पृष्ठ है:: मेरा परीक्षण का मामला बहुत सरल है! fitnesse.jar

!path C:\Program Files (x86)\Android\android-sdk\platforms\android-10\android.jar 
!path C:\Users\chan\git\Spotr\Spotr\bin\classes 

!|com.csun.spotr.fitnesse.FriendListActivityFixture| 
|URL|test?| 
|0|"wwa"| 

पथ के बाद से यह सिर्फ एक डेमो है, अपने परीक्षण पल में थोड़ा पागल लग सकता है । दुर्भाग्य से, मैं इन त्रुटियों को प्राप्त करता रहता हूं:

java.lang.RuntimeException: Stub! 
    at android.util.Log.e(Log.java:15) 
    at com.csun.spotr.util.JsonHelper.getJsonArrayFromUrl(JsonHelper.java:75) 
    at com.csun.spotr.fitnesse.FriendListActivityFixture.test(FriendListActivityFixture.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at fit.TypeAdapter.invoke(TypeAdapter.java:109) 
    at fit.TypeAdapter.get(TypeAdapter.java:97) 
    at fit.Fixture$CellComparator.compareCellToResult(Fixture.java:371) 
    at fit.Fixture$CellComparator.access$100(Fixture.java:357) 
    at fit.Fixture.compareCellToResult(Fixture.java:299) 
    at fit.Fixture.check(Fixture.java:295) 
    at fit.ColumnFixture.check(ColumnFixture.java:51) 
    at fit.Binding$QueryBinding.doCell(Binding.java:215) 
    at fit.ColumnFixture.doCell(ColumnFixture.java:37) 
    at fit.Fixture.doCells(Fixture.java:171) 
    at fit.Fixture.doRow(Fixture.java:165) 
    at fit.ColumnFixture.doRow(ColumnFixture.java:25) 
    at fit.Fixture.doRows(Fixture.java:159) 
    at fit.ColumnFixture.doRows(ColumnFixture.java:18) 
    at fit.Fixture.doTable(Fixture.java:153) 
    at fit.Fixture.interpretTables(Fixture.java:99) 
    at fit.Fixture.doTables(Fixture.java:79) 
    at fit.FitServer.process(FitServer.java:81) 
    at fit.FitServer.run(FitServer.java:56) 
    at fit.FitServer.main(FitServer.java:41) 

और मुझे नहीं पता कि यह मुझे क्या कह रहा है? मैंने add(), substract() जैसी अन्य परीक्षण विधि लिखी, सब ठीक काम किया। मुझे आश्चर्य है कि क्या इस त्रुटि में मुख्य धागे पर एक लंबा कार्य चलाना शामिल है? कोई उपाय?

उत्तर

36

android.jar में कक्षाओं का केवल स्टब कार्यान्वयन शामिल है। यह आपके ऐप के निर्माण के साधन प्रदान करता है, एक बार आपके पास एपीके होने के बाद आपको इसे एंड्रॉइड डिवाइस या एमुलेटर पर चलाना होगा।

यदि मैं गलत नहीं हूं तो आप होस्ट के JVM पर चलाने की कोशिश कर रहे हैं।

+0

धन्यवाद, मेरे परीक्षण स्थिरता वर्ग में कोई गतिविधि कोड नहीं है, इसलिए मुझे समझ में नहीं आता कि मुझे इसे डिवाइस पर क्यों चलाना है। वैसे भी, मुझे इसे डिवाइस पर चलाने की कोशिश करें। – Chan

+1

वही त्रुटि अगर मैं इसे अपने फोन पर चलाता हूं। कोई कामकाज? – Chan

+0

आपके पास androud.util.Log –

4

जैसा कि पहले उल्लेख किया गया है, एंड्रॉइड jar एस संकलन से परे कुछ भी अच्छा नहीं है। यहां तक ​​कि सबसे निर्दोष चीजें पूरी तरह से बाहर stubbed हैं। लेकिन आप अभी भी मेजबान वीएम यूनिट परीक्षणों में अच्छे मॉकिंग फ्रेमवर्क के साथ उनका उपयोग कर सकते हैं। मेरे चुनाव jmockit है:

सुनिश्चित नहीं हूं कि यह Roboelectric का उपयोग करके वास्तव में आसानी से हालांकि

+1

बहुत धन्यवाद। हालांकि मुझे अभी भी लगता है कि फिटनेस टेस्ट लिखने का एक बेहतर तरीका है, क्योंकि रास्ते में दस्तावेज़ करना आसान है। – Chan

+1

... लेकिन परीक्षण कार्यक्षमता अभी भी महत्वपूर्ण है। और यह मॉकिंग ढांचे के साथ-साथ अनुकूल भी हो सकता है –

9

Fitnesse के साथ काम करेंगे आप इस समस्या को और परीक्षण अपने आईडीई के भीतर ठीक कर सकते हैं।

dtmilano के रूप में, आप अपने लैपटॉप पर एंड्रॉइड कोड नहीं चला सकते हैं, लेकिन Roboelectric मूल रूप से Android.jar में स्टब्स के लिए वास्तविक विधि कार्यान्वयन को प्रतिस्थापित करता है।

दो बातें बाहर देखने के लिए अगर आप इस समाधान के साथ जाना:

  • सुनिश्चित करें कि आपके JAR आयात

  • यह चूक के लिए अगर इंटेलीजे

    का उपयोग कर अपने निर्भरता सूची में एंड्रॉयड जार ऊपर है इस धारणा के तहत HTTP अनुरोधों को अवरुद्ध करना कि आप वास्तव में किसी सर्वर की स्थिति को कहीं भी नहीं बदलना चाहते हैं। हालांकि, आप इसे आसानी से अक्षम कर सकते हैं: Roboelectric.getFakeHttpLayer()। InterceptHttpRequests (false);