首先我们头脑总中有这样一个actionmapping(注意只是假设的):
<action path=”/longin” type=”Jplateau.strutstestcase.LonginAction”
scope="request"
name="userForm">
<forward name="success" path="/main.jsp"/>
<forward name="login" path="/login.jsp"/>
</action>
有了这样一个假设,我们可以从测试代码入手:
public class TestLoginAction extends MockStrutsTestCase {
public void setUp() {
super.setUp();
//这里做一些初始化的东西,譬如数据库连接等
}
public void tearDown() {
super.tearDown();
//这里关闭你在setup中开启的资源,如关闭数据库连接等
}
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
//选择你要执行哪一个actionmapping?这里用我们刚才做的假设材料
this. setRequestPathInfo("/login");
//首先要初始化提交数据:用户名、密码
this.addRequestParameter(“usrename”,”Jplateau”);
this.addRequestParameter(“passwd”,”sandy”);
//注意有了这个之后,你可以从formbean中使用提交以后的用户名和密码数据了,下//面我会解释
//好,初始化数据完成以后开始执行action中的execute(),很简单,掉用actionPerform()
this. ActionPerform();
//严正返回是否正确?这里用我们刚才做的假设材料
this verifyForward(“success”);.
//下面验证登陆成功以后session中是否有用户的名称?
String expect_username_from_session=”Jplateau”;
//这里需要插写内容,是strutstestcase完全可以在测试代码中使用跟真实action
//中一样的环境,譬如可以通过this.getActionForm()得到相应的ActionForm
//可以通过this.getRequest()得到HttpRequest
//可以通过this.getSession()得到HttpSession,如下:
String actual_username_from_session=this.getSession().getAttribute(“authentication”);
this. assertEquals(“”, expect_username_from_session, actual_username_from_session);
}
public void testFailureLogin(){
//登陆失败的测试在此不写了
}
}
上边是一个简单的测试代码,好,运行!他此时肯定是通不过的,首先我们的java代码还没有写,struts-config.xml还没有配,那么,现在你可以现在做这些事情:“用简单的做法或代码让上边那个测试通过。”
第三部分:兼容struts1.1开发员
下面说写和struts1.1相关的内容:测试tiles和多模块!
测试tiles
假设我们的actionmapping中有这样forward到tiles的情况,如下:
//这里有关struts中tiles的使用不做介绍,请参考相关资料
<forward name="success" path="/userListLayout"/>
同时tiles_defs.xml中有相应配置:
//其中mainLayout是我在tiles定义的类型框架
<definition name="userListLayout" extends="mainLayout">
<put name="body" value="/main.jsp" />
</definition>
那么我们在测试代码中可以如下测试tiles
//
this. verifyTilesForward(“success”,”userListLayout”);
测试多模块:
关于多模块的测试我希望能在下面代码的注释部分给你一个大概的介绍:
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
//“mymodule”为系统中某个单独模块的名称(文件夹的名称)
setConfigFile("mymodule","/WEB-INF/struts-config-mymodule.xml");
//这个地方和前面单模块的例子有些差别,此处有两个参数,第一个参数是模块的
//名称,第二个参数的意义和上边相同;
//和单模块相比,上边两处区别
this.setRequestPathInfo("/mymodule","/login.do");
this.addRequestParameter("username","Jplateau");
this.addRequestParameter("password","sandy");
this.actionPerform();
this.verifyForward("success");
String expect_username_from_session=”Jplateau”;
String actual_username_from_session=this.getSession().getAttribute(“authentication”);
this. assertEquals(“”, expect_username_from_session, actual_username_from_session);
}
}
参考资源:
1. http://strutstestcase.sourceforge.net
(本篇文章基本上是沿用该篇文档的思路,英文好的可以阅读这篇文档。)
2. Kent Beck 《Test-Driven Development By Example》
3. 本文首发于本人资料站点:http://plateau.sicool.com