我正在使用一个Android应用程序,该应用程序是从Web服务下载JSON数据的。解析数据的类如下所示:
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; } }
当我parseCourse()从应用程序内部调用时,它构建良好并且可以正常工作,但是当我尝试在单元测试中测试此方法时,出现以下异常:
parseCourse()
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
org.json默认情况下,Android框架随附的软件包的类似乎在Java中不可用。
org.json
有没有一种方法可以解决此问题,以便可以对解析JSON的类进行单元测试?
您需要做的就是将以下行添加到build.gradle的dependency部分中:
testImplementation 'org.json:json:20140107'
请注意,您还需要使用Android Studio 1.1 或更高版本,并且至少要使用版本 22.0.0 或更高版本的构建工具才能正常工作!
testImplementation意味着包含该依赖项,因为测试依赖项仅在编译您的项目以执行单元测试时使用。提供的jar将不会包含在您的APK中,仅用于替换org.json包中缺少的类。
testImplementation