Testing 逐部分测试wicket页

Testing 逐部分测试wicket页,testing,wicket,Testing,Wicket,我有一个像这样的小门课: 公共类MyReport扩展了AbstractReport{ 私有静态最终长serialVersionUID=1L; 公共MyReport(PageParameters)引发ParseException异常{ 超级(参数); 试一试{ }捕获(解析异常){ 抛出新的RuntimeException(“缺少起始日期/截止日期”); } } @凌驾 受保护的void onInitialize(){ super.onInitialize(); setPageHeader();

我有一个像这样的小门课:

公共类MyReport扩展了AbstractReport{
私有静态最终长serialVersionUID=1L;
公共MyReport(PageParameters)引发ParseException异常{
超级(参数);
试一试{
}捕获(解析异常){
抛出新的RuntimeException(“缺少起始日期/截止日期”);
}
}
@凌驾
受保护的void onInitialize(){
super.onInitialize();
setPageHeader();
}
受保护的void setPageHeader(){
添加(新TaxHeader(“pageHeader”);//TaxHeader扩展面板
}
受保护的void setPageFooter(CustomerTo CustomerInfo-Footer){
//待补充
}
}
HTML标记如下所示

protected void setPageHeader(Component parent) {
    parent.add(new TaxHeader("pageHeader")); //TaxHeader extends Panel
}

标题
标题
页脚
测试类是这样的

protected void setPageHeader(Component parent) {
    parent.add(new TaxHeader("pageHeader")); //TaxHeader extends Panel
}
公共类ReportTest扩展了WicketTestBase{
@试验
公共作废报告应正确呈现(){
tester.startPage(MyReport.class,新页面parameters());
AssertRenderPage(MyReport.class);
}
}
我想做的是测试驱动,构建页面并测试它。我的意思是我想分别测试方法
setPageHeader()
setPageFooter()
。差不多

@测试
公共无效页面标题应正确()
但是,这是不可能的,因为wicket不会加载页面,并且会抱怨没有使用组件设置“pageFooter”wicket标记。 可以想象,对于一个包含大量wicket引用的复杂HTML页面,这意味着在运行上述测试之前,所有这些都已完成


有没有办法避免这种情况?注意,我不想以测试组件(即本例中的
TaxHeader
类)结束。我想要的是测试wicket的渲染。

这并不是对您问题的确切回答,但可能会有所帮助

正如您自己发现的那样,代码本身并不是非常可测试的。为了使它更易于测试,您必须消除方法中的紧密耦合。将
setPageHeader
方法更改为类似以下内容

protected void setPageHeader(Component parent) {
    parent.add(new TaxHeader("pageHeader")); //TaxHeader extends Panel
}
这将改善这一点,但它将属于您的
TaxHeader
类的域,并且应该移动到那里,从而产生令人惊讶的(因此可读性差)代码流

另一方面。。。问问自己,你是否真的必须测试这个方法。当然,100%的代码覆盖率看起来不错,但很少值得付出努力,甚至在任何方面都没有意义。这种方法有两个作用

  • 它调用wicket的
    add
    -方法,该方法的功能可以被认为是理所当然的(测试它将是wicket开发人员的工作)。使用情况由编译器检查,结果可由页面呈现测试检查
  • 它调用一个构造函数,该构造函数可以也应该进行测试,但不能在页面测试的上下文中进行测试。它值得自己进行一次测试,这可以通过使用WicketTester的StartComponentPage方法轻松完成

我知道TaxHeader作为一个组件可以单独测试。但是如何测试“我已经编写了要添加的代码”pageheader断言呢" . 当我作为“新手”开发Wicket页面时,这似乎有点违反直觉。框架中似乎有测试支持,但我似乎无法编写在整个页面完成之前和之后都会通过的原子测试。由于wicket不能与接口一起工作,您不能简单地使用模拟对象来测试,但您可以创建模拟组件(很可能是网页)包含所需的最小标记,并将其用作setPageHeader的参数。在Wickettester中,您可以断言路径“pageHeader”处的组件属于TaxHeader类型,从而验证您的断言。