论坛首页 Java企业应用论坛

(A22)Tapestry Core:Unit testing pages or components

浏览 2392 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-19  
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf  
页面或组件的单元测试
你可以非常容易的对某一页面或组件进行单元测试。跟随下面简单的工作:
  • 设置一个操作环境
为了测试页面,你需要创建一个PageTester.实例。它担当浏览器和servlet容器以使你可以使用它驾驭你的页面。事实上它不是一个真正的servlet容器,你需要告诉它你定义在web.xml中的同样信息:
  1. 你的应用包
  2. 你的过滤器名。这仅被用来装载你的Tapestry IoC模块。如果你没有,你可以传递一个空字符串或任何东西给它。
  3. 担当你上下文根目录的文件夹。这被用来定位你的模版(如果它们放在那里)。
这是一个例子(使用TestNG,但你也可以使用JUnit或其他的):
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "App1"// App1Module.java has configured some services.   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.     }   
  10. }   
  • 测试呈现页
要测试页面是否完全呈现,你可以告诉PageTester去呈现它,然后对返回的DOM文档(DOM Document)进行断言。
这是个例子。让我们假定被测试页名为”MyPage”并且它应该返回一个包含id为”id1”的HTML元素的页面并且它的文本内容应该是”hello”
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         assertEquals(doc.getElementById("id1").getChildText(), "hello");   
  11.     }   
  12. }   
如果页面需要一个文本,你可以通过这种方法传递:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Object[] context = new Object[]{ "abc"123 };   
  10.         Document doc = tester.invoke(new ComponentInvocation(new PageLinkTarget("MyPage"), context));   
  11.         assertEquals(doc.getElementById("id1").getChildText(), "hello");   
  12.     }   
  13. }   
  •  测试一个action 链接
页面呈现后,你应该想要”点击”一个action链接,然后对结果页断言。你可以这样做:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         Element link = doc.getElementById("link1");   
  11.         doc = tester.clickLink(link);   
  12.         assertTrue(doc.toString().contains("abc"));   
  13.     }   
  14. }   
  •  测试表单提交
页面呈现后,你应该想要填充表单,提交它然后检查结果页。你可以这样做:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         Element form = doc.getElementById("form1");   
  11.         Map fieldValues = new HashMap();   
  12.         fieldValues.put("field1""hello");   
  13.         fieldValues.put("field2""100");   
  14.         doc = tester.submitForm(form, fieldValues);   
  15.         assertTrue(doc.toString().contains("abc"));   
  16.     }   
  17. }   
通过点击一个提交按钮提交表单,调用clickSubmit()方法。
  •   组件的单元测试
要对组件进行单元测试,仅需要创建一个包含这个组件的测试页面。然后测试这个页面就可以了。.
  • 提供mock执行你的服务层
你的页面典型的是调用你的业务逻辑并且最终涉及到数据库。在单元测试时,尤其是测试你的UI(页面)时,强烈建议你不要调用它们。为了这样做,你应该放入你的事物控制代码,业务逻辑等到Tapestry IoC服务内。然后你应该使用mock 对象替换它们的执行。
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         Map serviceOverrides = new HashMap();   
  9.         Service1 service1Mock = new Service1() {   
  10.             public Object transform(Object input) {   
  11.                 //assert against the input and return some mock value   
  12.             }   
  13.         }   
  14.         Service2 service2Mock = new Service2() {   
  15.             public void perform(Object cmd) {   
  16.                 //assert against the cmd   
  17.             }   
  18.         }   
  19.         serviceOverrides.put("Service1", service1Mock);   
  20.         serviceOverrides.put("Service2", service2Mock);   
  21.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp", serviceOverrides);   
  22.     }   
  23. }   
 
论坛首页 Java企业应用版

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