2012-03-17 212 views
3

我正在嘗試爲我的某個類編寫一個AndroidTestCase,它可以連接到服務器並解析返回的JSONObject。當我在用戶界面中測試功能時,文件工作正常,解析並顯示正確的信息。當我將URL輸入到瀏覽器時,我得到正確的JSONObject。但是,當我嘗試通過AndroidTestCase獲取JSONObject並簡單驗證它不是null時,我在嘗試獲取URL的相應​​JSONObject時收到IOException。我驗證了它使用的網址是正確的。這是堆棧跟蹤。Android單元測試

java.net.UnknownHostException: api.penncoursereview.com 
at java.net.InetAddress.lookupHostByName(InetAddress.java:506) 
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:294) 
at java.net.InetAddress.getAllByName(InetAddress.java:256) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:322) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:285) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:267) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1018) 
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:512) 
at edu.upenn.cis.cis350.backend.Parser.retrieveJSONObject(Parser.java:34) 
at edu.upenn.cis.cis350.test.ParserTest.test_retrieveJSONObject(ParserTest.java:22) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at junit.framework.TestCase.runTest(TestCase.java:154) 
at junit.framework.TestCase.runBare(TestCase.java:127) 
at junit.framework.TestResult$1.protect(TestResult.java:106) 
at junit.framework.TestResult.runProtected(TestResult.java:124) 
at junit.framework.TestResult.run(TestResult.java:109) 
at junit.framework.TestCase.run(TestCase.java:118) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448) 

任何想法爲什麼代碼在模擬器中工作,但沒有在測試?

在此先感謝您的幫助!

編輯:

下面是相關方法:34

public JSONObject retrieveJSONObject(String path){ 
    try{ 
     URL url = new URL(path); 
     Log.w("Parser: retrieveJSONObject", "url=" + url); 
     URLConnection connection = url.openConnection(); 
     String line; 
     StringBuilder builder = new StringBuilder(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     while ((line = reader.readLine()) != null) { 
      builder.append(line); 
     } 
     Log.v("Length",builder.toString()); 

     return new JSONObject(builder.toString()); 
    } 
    catch(IOException e) { 
     Log.w("Parser: retrieveJSONObject", "IOException: Bad Url"); 
     e.printStackTrace(); 
     return null; 
    } catch (JSONException e) { 
     Log.w("Parser: retrieveJSONObject", "JSONException: mis-formatted JSON"); 
     e.printStackTrace(); 
     return null; 
    } 
} 

線是初始化的BufferedReader的行。

+0

可以從您的解析器類(約34行)提供一些相關的代碼 – 207 2012-03-17 22:53:10

+0

,也許你做的不僅僅是在你的測試用例的方法調用「retrieveJSONObject」更多。如果是這樣粘貼代碼 – 207 2012-03-17 23:13:01

+0

我添加了上面的retrieveJSONObject方法。我認爲這種方法非常獨立,可以獨立於其他人進行測試。 – Jin 2012-03-18 02:37:35

回答

1

我猜你缺少的是INTERNET權限。 考慮到您的方法在Utils類中定義爲static,以下測試工作。

public void testRetrieveJSONObjectWithUrl() { 
    final String url = "http://www.bom.gov.au/fwo/IDV60901/IDV60901.94868.json"; 
    assertNotNull(Utils.retrieveJSONObject(url)); 
} 
+0

啊我沒有將Internet權限添加到我的測試項目中。非常感謝! – Jin 2012-03-18 18:24:33