《研磨struts2》第十六章 单元测试 之 16.2 测试动作类Action
16.2 测试动作类Action
16.2.1测试动作类Action入门
通过前面的学习已经了解到:Struts2的动作类Action,可以做到完全和web无关,不再依赖HttpServletRequest和HttpServletResponse等servlet的Api,因此,可以非常方便的直接在java application中调用和运行。
来写一个Action,它没有什么特殊的功能,只是接收一个UserModel对象,判断这个对象的name属性,如果等于struts2则整个Action跳转到名为success的Result,否则跳转到名为error的Result,示例代码如下:
public class TestAction extends ActionSupport{ private UserModel user; public UserModel getUser() { return user; } public void setUser(UserModel user) { this.user = user; } public String execute() throws Exception { if ("Struts2".equals(user.getName())){ return SUCCESS; }else{ return ERROR; } } }
这个Action类平平无奇,甚至比以前写过的大多数Action类都要简单。
在第四章中,已经看到了如何在java application中测试这个Action类了:直接在main方法中新建这个类的一个对象,它需要的参数可以直接通过setUser方法赋予,调用这个对象的execute方法,可以直接看到这个Action类运行后要跳转到的Result:
public class MyTest { public static void main(String[] args) { TestAction action = new TestAction(); UserModel user = new UserModel(); user.setName("Struts2"); action.setUser(user); try { String result = action.execute(); System.out.println("result:\t" + result); } catch (Exception e) { e.printStackTrace(); } } }
运行一下,最终得到的结果“result:success”,如果把name的值改为别的,则会得到“result:error”的结果。
接下来思考几个问题:
- 到底测试了Struts2的哪些组件?
答:现在测试的是Action组件。
测试的时候所依赖的环境和真正运行的环境是否一样?
答:不一样,在上面的测试中并没有依赖web环境,但是完全可以模仿HttpServletRequest向Action中传入参数。测试的结果能做到自动判断而不需要人工介入吗?
答:现在仍需要由人工去判断。虽然上面的测试正常运行了,可是依赖人工去判断测试是否正确,这不是个长久之计,因为随着功能越来越多,那么人工判断的量就会非常大;而且,按照每日集成测试的建议,通常需要测试全部的功能,也就是从第一个功能开始一直测试到当天的新功能,因为新写的代码可能会对以前已经实现的功能带来影响,这样再依赖于人工判断,就有点不太现实了。
这种情况下,一定要引入一些测试的工具,好帮助我们进行单元测试和自动化的测试。当然,这方面的工具,鼎鼎大名的就是JUnit了,下面一起来看看。
16.2.2使用JUnit测试动作类Action
要使用JUnit来进行测试,首先就要在工程中添加对Junit的支持。
请在工程上右击,点击【Properties】得到工程的属性页,在左边选择【Java Build Path】,然后在右边选择Libraries,如下图所示:
图16.1 选择工程的Properties属性页中的Libraries
然后点击【Add Library】,弹出选择对话框:
图16.2 库选择对话框
选中其中的JUnit,点击【Next】。得到JUnit版本选择对话框:
图16.3 JUnit版本选择对话框
选择常用的JUnit3即可,点击【Finish】,至此就在我们的工程中加入了对JUnit的支持。使用JUnit进行单元测试的具体知识,这里就不去展开讲述了
来编写一个测试TestAction的测试用例,要测试的功能跟上面的要求是一样的,示例代码如下:
public class TestActionTestCase extends TestCase { public void testName() { TestAction action = new TestAction(); UserModel user = new UserModel(); user.setName("Struts2"); action.setUser(user); try { String result = action.execute(); assertEquals("success", result); } catch (Exception e) { e.printStackTrace(); } } }
测试用例的类要继承junit中的TestCase,每个测试方法,都是public的、没有参数的、没有返回值的、且方法名必须以“test”开头的方法。
观察方法中的代码,跟上一小节中main方法里写的差不多,只不过最后不是打印出结果,而是用assertEquals(“success”,result)来判断结果是否和预期的值相同。如果相同,则这个测试方法就会被判断为通过测试。
运行这个测试,和运行java applicataion相似,也是在代码中任意地方右击,选择弹出菜单的【Run as】->【JUnit test】,会出现一个新的JUnit的视图,显示绿条表明测试通过。
图16.4 JUnit运行结果
经过这一小节的学习,仍然测试的是Action组件,也仍然脱离了web环境进行测试,但是单元测试的代码可以自动判断测试是否成功了。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4144.html】
欢迎访问http://sishuok.com获取更多内容