如何对JSON解析进行单元测试 [英] How to unit test JSON parsing

查看:190
本文介绍了如何对JSON解析进行单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一款Android应用,我可以从网络服务中下载JSON数据。解析数据的类看起来像这样:

I'm working on an Android app in which I download JSON data from a web service. The class parsing the data looks something like this:

public class JsonCourseParser implements CourseParser {

    public Course parseCourse(String courseData) {
        Course result;

        try {
            JSONObject jsonObject = new JSONObject(courseData);

            ...

            result = new Course("foo", "bar");
        } catch (JSONException e) {
            result = null;
        }

        return result;
    }
}

这构建得很好,当我打电话时它可以正常工作code> parseCourse()来自我的应用程序,但当我尝试在单元测试中测试此方法时,我得到此异常:

This builds just fine and it works when I call parseCourse() from within my app, but when I try to test this method in a unit test I get this exception:

java.lang.NoClassDefFoundError: org/json/JSONException
    at JsonCourseParserTest.initClass(JsonCourseParserTest.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.json.JSONException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    ... 16 more

默认情况下,Java框架中似乎没有提供Android框架附带的 org.json 包的类。

It seems that the classes of the org.json package which come with the Android Framework are not available in Java by default.

我有没有办法解决这个问题,所以我可以对解析JSON的类进行单元测试?

Is there a way I can fix this so I can unit test the classes which parse JSON?

推荐答案

您需要做的就是将以下行添加到build.gradle中的依赖项部分:

All you need to do is add the following line to the dependency section in your build.gradle:

testCompile 'org.json:json:20140107'

请注意,您还需要使用Android Studio 1.1 或更高版本以及至少构建工具版本 22.0.0 或更高版本才能生效!

Note that you also need to use Android Studio 1.1 or higher and at least build tools version 22.0.0 or above for this to work!

testCompile 表示包含依赖项,因为只有在编译项目以执行单元测试时才会使用测试依赖项。提供的jar将不会包含在您的APK中,并且仅用于替换 org.json 包中缺少的类。

testCompile means that the dependency is included as a test dependency will only be used when your project is being compiled for executing unit tests. The supplied jar will not be included in your APK and will only be used to replace the missing classes in the org.json package.

这篇关于如何对JSON解析进行单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆