现在的位置: 首页 > 综合 > 正文

Android-Junit-TestCase-ClassLoader

2013年08月28日 ⁄ 综合 ⁄ 共 1922字 ⁄ 字号 评论关闭
近期在自学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]);
}
}

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

  Manifest.xml
  Java代码 :

  异常栈:
  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

  BTW,昨天在跑另个case的是有也遇到ClassNotFound,后来继承关系从TestCase换成 ActivityInstrumentationTestCase2就正常了,从这里推测应该是android.*这个package下面的类都需要 android.test下的TestCase才能跑的动。如果是这样的话,要测一些东西还是挺费劲的,等于带着容器一起跑测试。
  更不明白的就是,android的classLoader是一种怎样的工作机制?不知道大家有无遇到类似的问题,有什么好的解决方案。

抱歉!评论已关闭.