0

我有一个像这样的检票口课:

public class MyReport extends AbstractReport {

    private static final long serialVersionUID = 1L;


    public MyReport(PageParameters parameters) throws ParseException {
        super(parameters);
        try {

        } catch (ParseException e) {
            throw new RuntimeException("Missing from/to date");
        }
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();
        setPageHeader();
    }

    protected void setPageHeader() {
        add(new TaxHeader("pageHeader")); //TaxHeader extends Panel

    }

    protected void setPageFooter(CustomerDTO customerInfoForFooter) {
       //TO BE ADDED

     }

}

HTML标记是这样的

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<wicket:head>
    <title><wicket:message key="k4.title">Title</wicket:message></title>
    <meta name="author" content="abc" />

    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <wicket:link>
        <link rel="stylesheet" type="text/css" href="general.css" media="all" />
    </wicket:link>
</wicket:head> 

<BODY>
    <div id="pageHeader" class="pageHeader" wicket:id="pageHeader" >HEADER</div>
       <div id="pageFooter" class="pageFooter" wicket:id="pageFooter" >FOOTER</div>


   </BODY>
   </html>

测试类是这样的

public class ReportTest extends WicketTestBase {

@Test
public void reportShouldRenderCorrectly() {
    tester.startPage(MyReport.class, new PageParamenters());
    tester.assertRenderedPage(MyReport.class);
}

}

我想要的是通过构建页面和测试来进行测试驱动。我的意思是我想分别测试这些setPageHeader()方法setPageFooter()。就像是

@Test
public void pageHeaderShouldRenderCorrectly()

然而,这是不可能的,因为检票口不会加载页面并抱怨“pageFooter”检票口标签尚未使用组件设置。可以想象,对于具有大量检票口引用的复杂 HTML 页面,这意味着在运行上述测试之前所有这些都已完成。

有没有办法绕过这个?请注意,我不想最终测试组件(即TaxHeader本例中的类)。我想要的是测试检票口的渲染。

4

1 回答 1

0

这不完全是您问题的答案,但无论如何可能会有所帮助......

正如您自己发现的那样,它的代码不是非常可测试的。为了使其更具可测试性,您必须摆脱方法中的紧密耦合。将方法更改为setPageHeader这样的

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

会改善这一点,但它会属于你的TaxHeader类的域,应该移到那里,导致令人惊讶(因此可读性差)的代码流。

另一方面...问问自己是否真的必须测试这种方法。当然 100% 的代码覆盖率看起来很棒,但很少值得付出努力,甚至更罕见地具有任何意义。这个方法做了两件事。

  • 它调用 wicket 的add-method,其功能可以被视为理所当然(并且测试它将是 wicket 开发人员的工作)。使用情况由编译器检查,结果可以由您的 page-rendering-test 检查
  • 它调用了一个构造函数,可以并且应该进行测试,但不能在页面测试的上下文中进行测试。它值得自己进行测试,这可以通过使用 WicketTester 的 startComponentInPage 方法轻松完成。
于 2013-09-19T07:38:51.850 回答