问题是这样, 测试类继承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是一种怎样的工作机制?不知道大家有无遇到类似的问题,有什么好的解决方案。