Wicket testing startPanel(面板)和PageParameters-如何设置它们?

Wicket testing startPanel(面板)和PageParameters-如何设置它们?,wicket,Wicket,目前我正在使用WicketTester的startPanel方法测试我的面板。在这些面板中,我经常使用getPage().getPageParameters()使用PageParameters来访问数据。但是,startPanel方法不初始化DummyPage的任何页面参数,也不提供设置页面参数的功能 如何在面板测试期间设置页面参数?您可以使用TestPanelSource的匿名(或子类)来创建页面和面板 final WebPage parameterPage = new WebPage(pag

目前我正在使用WicketTester的startPanel方法测试我的面板。在这些面板中,我经常使用getPage().getPageParameters()使用PageParameters来访问数据。但是,startPanel方法不初始化DummyPage的任何页面参数,也不提供设置页面参数的功能


如何在面板测试期间设置页面参数?

您可以使用TestPanelSource的匿名(或子类)来创建页面和面板

final WebPage parameterPage = new WebPage(pageParmeters);
final Panel panelUnderTest = .... create panel here ....;
parameterPage.add(panelUnderTest);
wicketTester.startPanel(new TestPanelSource(){
    public Panel getTestPanel(final String panelId) {
        return panelUnderTest;
    }
});

如果您经常使用它,TestPanelSource的子类可能最好能够将参数传递到子类的构造函数和您感兴趣的其他可配置项中。

这真的是这样做的吗?startPanel已经为我们创建了一个虚拟页面,但是没有任何页面参数。使用您的方法将面板附加到两页,这对我来说似乎不是最佳解决方案。现在,我使用startPanel(面板,页面参数)功能扩展了WicketTester:

public Panel startPanel(final TestPanelSource testPanelSource, final PageParameters parameters) {
    return (Panel) startPage(new ITestPageSource() {
        public Page getTestPage() {
            return new DummyPanelPage(testPanelSource, parameters);
        }
    }).get(DummyPanelPage.TEST_PANEL_ID);
}
并使用页面参数构造函数创建了一个新的虚拟面板页面

public class DummyPanelPage extends WebPage {

    /** 
     * The dummy <code>Panel</code> <code>Component</code> id.
     */
    public static final String TEST_PANEL_ID = "panel";

    /**
     * Default constructor.
     * @param testPanelSource <code>TestPanelSource</code>
     */
    public DummyPanelPage(final TestPanelSource testPanelSource, final PageParameters parameters) {
        super(parameters);
        add(testPanelSource.getTestPanel(TEST_PANEL_ID));
    }

}

我不明白为什么这个功能不是由Apache直接提供的。

我个人认为,通过
getPage()获取
PageParameters
。getPageParameters()
是一种次优的方式

它引入了一个从面板到页面的依赖关系,这使得它们紧密耦合,难以测试,正如您所看到的

如果您需要从
面板
中访问
页面参数
,请通过创建接受这些参数的构造函数来注入这些参数,方法如下:

private PageParameters params;

public MyPanel (String id, Model<T> model, PageParameters params) {
    super(id, model);
    this.params = params;
    ...
}
私有页面参数参数;
公共MyPanel(字符串id、模型模型、页面参数参数){
超级(id,型号);
this.params=params;
...
}

这样,您就可以在
面板中使用
参数
,使用测试中可以想象的任何
页面参数构建
面板
,避免了被证明是不利的耦合。

+1我的第一反应是使用startPage而不是startPanel,并使用构建的测试页面来处理页面参数。但是你的解决方案更好。+1我没意识到它启动了自己的页面。这更接近于我如何编写你的测试,然后Jeroen。