`
cynhafa
  • 浏览: 155434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

主题:Android-Junit-TestCase-ClassLoader 讨论下Android的单元测试

 
阅读更多

原文网址 http://www.iteye.com/topic/738000

近期在自学android开发,在做例子的时候,发现单元测试方面的资料好像不多,希望能在这儿和大家一起讨论下。 有一个问题在问答频道放了好几天,都无人回答,先拿过来重发下,也想依借此为引子,说说android下的测试驱动开发。 问题是这样, 测试类继承TestCase,其中有试图mock一个Cursor进行单元测试,一跑就ClassNotFoundException 测试类: Java代码 import junit.framework.TestCase; import android.database.Cursor; public class ContactHandlerTest extends TestCase { private ContactHandler handler; @Override protected void setUp() throws Exception { super.setUp(); handler = new ContactHandler(); } public void testConvertToString() { Cursor mockCursor = new MockCursor(); String [] result = handler.convertToString(mockCursor); assertEquals("kkkk(2222)", result[0]); assertEquals("aaaa(3333)", result[1]); } } import junit.framework.TestCase; import android.database.Cursor; public class ContactHandlerTest extends TestCase { private ContactHandler handler; @Override protected void setUp() throws Exception { super.setUp(); handler = new ContactHandler(); } public void testConvertToString() { Cursor mockCursor = new MockCursor(); String [] result = handler.convertToString(mockCursor); assertEquals("kkkk(2222)", result[0]); assertEquals("aaaa(3333)", result[1]); } } MockCursor: 仅仅mock了一些想要的动作 Java代码 import android.content.ContentResolver; import android.database.CharArrayBuffer; import android.database.ContentObserver; import android.database.Cursor; import android.database.DataSetObserver; import android.net.Uri; import android.os.Bundle; public class MockCursor implements Cursor { private String [][] dump = new String [][] { {"kkkk", "2222"}, {"aaaa", "3333"} }; …………………… ………… …… } import android.content.ContentResolver; import android.database.CharArrayBuffer; import android.database.ContentObserver; import android.database.Cursor; import android.database.DataSetObserver; import android.net.Uri; import android.os.Bundle; public class MockCursor implements Cursor { private String [][] dump = new String [][] { {"kkkk", "2222"}, {"aaaa", "3333"} }; …………………… ………… …… } Manifest.xml Java代码

<!--l version="1.0" encoding="utf-8-->

<!--l version="1.0" encoding="utf-8-->

异常栈: Java代码 java.lang.NoClassDefFoundError: android/database/Cursor at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Unknown Source) at java.lang.Class.getMethod0(Unknown Source) at java.lang.Class.getMethod(Unknown Source) Caused by: java.lang.ClassNotFoundException: android.database.Cursor at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 10 more java.lang.NoClassDefFoundError: android/database/Cursor at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Unknown Source) at java.lang.Class.getMethod0(Unknown Source) at java.lang.Class.getMethod(Unknown Source) Caused by: java.lang.ClassNotFoundException: android.database.Cursor at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 10 more BTW,昨天在跑另个case的是有也遇到ClassNotFound,后来继承关系从TestCase换成 ActivityInstrumentationTestCase2就正常了,从这里推测应该是android.*这个package下面的类都需要 android.test下的TestCase才能跑的动。如果是这样的话,要测一些东西还是挺费劲的,等于带着容器一起跑测试。 更不明白的就是,android的classLoader是一种怎样的工作机制?不知道大家有无遇到类似的问题,有什么好的解决方案。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics