Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Design Pattern & UML  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
话题被移动
该话题已被移动 - why , 2003-06-22 00:22
如果您尚不清楚该话题被移动的原因,请参考论坛规则以及本版公告或者联系本版版主。
作者 JUnitX快速上手指南
fjchenq





发贴: 233
积分: 20
于 2003-03-20 13:17 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
JUnitX顾名思义就知道是一个JUnit的扩展包,JUnit在使用上的主要局限是只能测试那些public的方法和成员变量。JUnitX的出现动机就是提供测试私有和保护
方法的单元测试工具,它建立在JUnit之上,其关键类junitx.framework.PrivateUseCase继承了JUnit.framework.TestCase,所以JUnit提供的TestRunner可以直接运行基于PrivateUseCase的测试类。

PrivateUseCase的使用和UseCase类的使用区别还是比较大的,由于要测试private和protected方法,就需要绕过Java的访问限制,JUnitX利用了Reflection机制完成这一点,也因此使得基于PrivateUseCase的测试代码显得比较“怪异”,下面介绍一个简化的使用步骤:
1. 把junitx.jar存入合适目录,并加入classpath,如果用 IDE工具运行testrunnr,也要在IDE里设。
2. 在你要测试的类mypackage.MyClass所属的包中增加一个类 mypackage.TestProxy,代码如下:道理以后解释。
//
//TestProxy.java
//
import junitx.framework.TestAccessException;

public class TestProxy
extends junitx.framework.TestProxy
{
public Object newInstance (Object[] anArgList)
throws TestAccessException
{
try
{
return getProxiedClass ().getConstructor (anArgList).
newInstance (anArgList);
}
catch (Exception e)
{
throw new TestAccessException ("could not instantiate " +
getTestedClassName (), e);
}
}

public Object newInstanceWithKey (String aConstructorKey,
Object[] anArgList)
throws TestAccessException
{
try
{
return getProxiedClass ().getConstructor (aConstructorKey).
newInstance (anArgList);
}
catch (Exception e)
{
throw new TestAccessException ("could not instantiate " +
getTestedClassName (), e);
}
}
}

//这个类其实就是为PrivateUseCase访问私有方法充作Proxy

3. 然后就可以写能访问私有方法的测试类了,记住继承PrivateUseCase
例如:
public class TestTableTreeExtractor extends PrivateTestCase {

public TestTableTreeExtractor(String s) {
superMoon;
}

public void testInitTags() throws TestAccessException {
Object obj = newInstance("aies.TableTreeExtractor",NOARGS);
invoke(obj,"initTags",NOARGS);
Vector s = (Vector)get(obj, "tableTags");
assertNotNullMoon;
assertEquals(4,s.size());

}



解释一下,使用newInstance方法得到对象实例,使用invoke调用对象的私有方法,使用get得到对象的私有属性,NOARGS是Object[]类型的一个常量。

恩,照着这个例子,就应该可以自己写JUnitX的测试用例了,呵呵。下次有空再解释它的工作机制罢,其实感兴趣的down源码下来看看,对reflection机制会有很好的理解。




有了Swing为什么还要SWT?

话题树型展开
人气 标题 作者 字数 发贴时间
5784 JUnitX快速上手指南 fjchenq 2267 2003-03-20 13:17

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923