Java 使用Wicket Tester时,如何在单元测试中保持组件路径不变
我有几个针对可排序数据表的wicket测试,特别是ajax,单击可排序列标题并断言呈现的主体行的内容。现在,wicket框架会自动生成表组件子体的组件层次结构,并生成指向排序链接(ajax)的路径,类似于:Java 使用Wicket Tester时,如何在单元测试中保持组件路径不变,java,datatable,wicket,wicket-tester,Java,Datatable,Wicket,Wicket Tester,我有几个针对可排序数据表的wicket测试,特别是ajax,单击可排序列标题并断言呈现的主体行的内容。现在,wicket框架会自动生成表组件子体的组件层次结构,并生成指向排序链接(ajax)的路径,类似于: table:topToolbars:toolbars:0:headers:1:header:orderByLink table:topToolbars:toolbars:1:headers:1:header:orderByLink 但是,当数据表在测试中重新呈现时,工具栏组件的索引每次都
table:topToolbars:toolbars:0:headers:1:header:orderByLink
table:topToolbars:toolbars:1:headers:1:header:orderByLink
但是,当数据表在测试中重新呈现时,工具栏组件的索引每次都会增加,即类似于:
table:topToolbars:toolbars:0:headers:1:header:orderByLink
table:topToolbars:toolbars:1:headers:1:header:orderByLink
这会打断后续测试的硬编码路径,因为它们不再匹配
datatable构造的代码片段如下所示:
final PayeesProvider dataProvider = new PayeesProvider();
table = new DataTable<ResponsePayeeDetails>("payees", columns, dataProvider, rowsPerPage);
table.setOutputMarkupId(true);
table.addTopToolbar(new AjaxFallbackHeadersToolbar(table, dataProvider) {
private static final long serialVersionUID = -3509487788284410429L;
@Override
protected WebMarkupContainer newSortableHeader(final String borderId, final String property, final ISortStateLocator locator) {
return new AjaxFallbackOrderByBorder(borderId, property, locator, getAjaxCallDecorator()) {
@Override
protected void onRender() {
System.out.printf("Path: %s\n", this.getPageRelativePath());
super.onRender();
}
private static final long serialVersionUID = -6399737639959498915L;
@Override
protected void onAjaxClick(final AjaxRequestTarget target) {
target.add(getTable(), navigator, navigatorInfoContainer);
}
@Override
protected void onSortChanged() {
super.onSortChanged();
getTable().setCurrentPage(0);
}
};
}
});
table.addBottomToolbar(new NoRecordsToolbar(table));
add(table);
(第二次测试)
(第三次测试)
(第四次测试)
(第五次测试)
有人知道我如何强制索引生成更具确定性/可重复性吗。或者,是否有一种方法可以随意梳理或概括路径,从而使它们对这些增量免疫
伙计们,任何帮助都将不胜感激 确定路径可能非常困难,但不必要,因为这将包括集成测试而不是单元测试。 测试列的排序不应该依赖于周围的表,因此您可以在测试用例中创建一个虚拟表,为测试添加标题和一列(要排序的列)。如果您有工具栏对象,可以立即使用它,也可以通过发出
getComponent(toolbar.getPageRelativePath())
重新检索它。
但是,作为此类用户,确保AjaxFallbackOrderByBorder真正起作用不应该是您关心的问题。这应该由类的创建者完成。您只需测试自己的代码(如数据提供程序中的排序代码)…由于默认的
数据表
,每次刷新表时都会生成全新的项,因此每次id都会增加。如果保持id不变是首要任务,那么实现自定义ItemReuseStrategy
可能会有一些运气
我们遇到了类似的问题,并已确定了与您的备选问题相一致的策略。这样,您可以要求测试检查,例如,最后呈现页面上的第三行。注意:代码在Scala中
简而言之,为了解决这个问题,我们实现了一个findNthComponentOnPage
方法来增强WicketTester
/**
* @param id Wicket id of component to find
* @param n 1-based
* @tparam T class of component to find
* @return the Nth component of class T appearing on the lastRenderedPage
*/
def findNthComponentOnPage[T <: Component : ClassTag](id: String, n: Int): T = {
tester.getLastRenderedPage.visitChildren(classTag[T].runtimeClass, new IVisitor[T, T] {
var count = 0
override def component(checkbox: T, visit: IVisit[T]): Unit = {
if (checkbox.getId == id) {
count += 1
if (count == n) {
visit.stop(checkbox)
}
}
}
})
}
/**
*@param id要查找的组件的Wicket id
*@param n基于1
*@T要查找的组件的T类
*@return出现在LastRenderPage上的类T的第n个组件
*/
def FindNTHComponent第页[T感谢Nicktar,我不确定我是否完全遵守了。我试图实现的有点类似于集成测试——细微的区别在于服务层都是模拟的。因此,为了确保所有组件(UI和非UI)都正确连接,我通过呈现的小部件触发手势,并验证生成的页面片段。I正如您所建议的,可以验证重新生成的模型,但这可能会排除测试相同的模型是否已在请求往返过程中正确配置并连接到UI。或者我是否错过了您的要点?@Michael-7我的观点是,此测试不应是nessecary,至少不应以单元测试的形式。我将单元测试与集成测试分开tion测试,通过jUnit运行Former,检查模型和内容,然后从“high Upper”运行后者使用selenium或类似的东西,检查呈现的页面…感谢您的反馈Nicktar。我使用wicketTester的原因是为了避免使用selenium,这很好,但很麻烦-例如,必须启动服务器e.t.c。wicketTester正是我测试服务器端组件,特别是服务器端端到端组件所需要的我必须强调的是,这不是一个单元测试,而是一个服务层中断的集成测试。
Path: payees:topToolbars:toolbars:6:headers:1:header
Path: payees:topToolbars:toolbars:6:headers:2:header
Path: payees:topToolbars:toolbars:6:headers:1:header
Path: payees:topToolbars:toolbars:6:headers:2:header
Path: payees:topToolbars:toolbars:6:headers:1:header
Path: payees:topToolbars:toolbars:6:headers:2:header
Path: payees:topToolbars:toolbars:8:headers:1:header
Path: payees:topToolbars:toolbars:8:headers:2:header
/**
* @param id Wicket id of component to find
* @param n 1-based
* @tparam T class of component to find
* @return the Nth component of class T appearing on the lastRenderedPage
*/
def findNthComponentOnPage[T <: Component : ClassTag](id: String, n: Int): T = {
tester.getLastRenderedPage.visitChildren(classTag[T].runtimeClass, new IVisitor[T, T] {
var count = 0
override def component(checkbox: T, visit: IVisit[T]): Unit = {
if (checkbox.getId == id) {
count += 1
if (count == n) {
visit.stop(checkbox)
}
}
}
})
}