Android单元测试

时间:2012-03-17 22:18:33

标签: android junit

我正在尝试为我的一个类编写一个AndroidTestCase,它连接到服务器并解析返回的JSONObject。当我在UI中测试功能时,文件工作正常,并且解析和显示正确的信息。当我将URL输入浏览器时,我得到了正确的JSONObject。但是,当我尝试通过AndroidTestCase获取JSONObject并且只是验证它不是null时,我在尝试获取url的相应JSONObject时得到IOException。我确认它使用的网址是正确的。这是堆栈跟踪。

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)

知道为什么代码在模拟器中工作但不在测试中?

提前感谢您的帮助!

编辑:

以下是相关方法:

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;
    }
}

第34行是初始化BufferedReader的行。

1 个答案:

答案 0 :(得分:1)

我猜您缺少的是 INTERNET 权限。 考虑到您的方法在static类中定义Utils,以下测试可以正常运行。

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