论坛首页 移动开发技术论坛

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

浏览 5072 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-15  
  近期在自学android开发,在做例子的时候,发现单元测试方面的资料好像不多,希望能在这儿和大家一起讨论下。
有一个问题在问答频道放了好几天,都无人回答,先拿过来重发下,也想依借此为引子,说说android下的测试驱动开发。

问题是这样, 测试类继承TestCase,其中有试图mock一个Cursor进行单元测试,一跑就ClassNotFoundException

测试类:
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了一些想要的动作
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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.demo.contact.test" android:versionCode="1"
	android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">

		<uses-library android:name="android.test.runner" />
	</application>
	
	<uses-sdk android:minSdkVersion="7" />
	<instrumentation android:targetPackage="com.demo.contact"
		android:name="android.test.InstrumentationTestRunner" />
	
</manifest> 


异常栈:
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是一种怎样的工作机制?不知道大家有无遇到类似的问题,有什么好的解决方案。
   发表时间:2010-08-16  
http://developer.android.com/guide/topics/testing/testing_android.html

感觉文档说的很详尽了啊
0 请登录后投票
   发表时间:2010-08-20  
试了好久,http://developer.android.com/guide/topics/testing/testing_android.html 都打不开。
甚至http://developer.android.com也打不开。

下载的docs好像没有testing的topics~~
0 请登录后投票
   发表时间:2010-08-23  
shiftjava 写道
试了好久,http://developer.android.com/guide/topics/testing/testing_android.html 都打不开。
甚至http://developer.android.com也打不开。

下载的docs好像没有testing的topics~~


http://androidappdocs.appspot.com/index.html
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics