`

《研磨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,示例代码如下:

 

java代码:
  1. public class TestAction extends ActionSupport{  
  2.     private UserModel user;  
  3.     public UserModel getUser() {  
  4.         return user;  
  5.     }  
  6.     public void setUser(UserModel user) {  
  7.         this.user = user;  
  8.     }  
  9.     public String execute() throws Exception {  
  10.         if ("Struts2".equals(user.getName())){  
  11.             return SUCCESS;  
  12.         }else{  
  13.             return ERROR;  
  14.         }  
  15.     }  
  16. }  

这个Action类平平无奇,甚至比以前写过的大多数Action类都要简单。

       在第四章中,已经看到了如何在java application中测试这个Action类了:直接在main方法中新建这个类的一个对象,它需要的参数可以直接通过setUser方法赋予,调用这个对象的execute方法,可以直接看到这个Action类运行后要跳转到的Result:

 

java代码:
  1. public class MyTest {  
  2.     public static void main(String[] args) {  
  3.         TestAction action = new TestAction();  
  4.   
  5.         UserModel user = new UserModel();  
  6.         user.setName("Struts2");  
  7.           
  8.         action.setUser(user);  
  9.   
  10.         try {  
  11.             String result = action.execute();  
  12.             System.out.println("result:\t" + result);  
  13.         } catch (Exception e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17. }  

运行一下,最终得到的结果“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的测试用例,要测试的功能跟上面的要求是一样的,示例代码如下:

 

java代码:
  1. public class TestActionTestCase extends TestCase {  
  2.     public void testName() {  
  3.         TestAction action = new TestAction();  
  4.   
  5.         UserModel user = new UserModel();  
  6.         user.setName("Struts2");  
  7.   
  8.         action.setUser(user);  
  9.         try {  
  10.             String result = action.execute();  
  11.             assertEquals("success", result);  
  12.         } catch (Exception e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.     }  
  16. }  

测试用例的类要继承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获取更多内容

8
5
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics