gpt4 book ai didi

java - 使用 Wicket Tester 时如何在单元测试中保持组件路径不变

转载 作者:搜寻专家 更新时间:2023-11-01 00:57:52 28 4
gpt4 key购买 nike

我有几个针对可排序数据表的 wicket 测试,特别是通过 ajax-clicking 可排序列标题并断言呈现的正文行的内容。现在表组件的后代的组件层次结构由 wicket 框架自动生成,并导致排序链接 (ajax) 的路径类似于:

table:topToolbars:toolbars:0:headers:1:header:orderByLink

但是,当 DataTable 在测试中重新呈现时,工具栏组件的索引每次都会递增,即类似于:

table:topToolbars:toolbars:1:headers:1:header:orderByLink

然后打破后续测试的硬编码路径,因为它们将不再匹配。

数据表构建的代码片段如下:

        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);

准确地说,当我运行测试时,上面的 System.out.printf 语句打印:

(第一次测试)

Path: payees:topToolbars:toolbars:0:headers:1:header
Path: payees:topToolbars:toolbars:0:headers:2:header

(第二次测试)

Path: payees:topToolbars:toolbars:2:headers:1:header
Path: payees:topToolbars:toolbars:2:headers:2:header

(第三次测试)

Path: payees:topToolbars:toolbars:4:headers:1:header
Path: payees:topToolbars:toolbars:4: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: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

有谁知道如何强制索引生成更具确定性/可重复性。或者,是否有一种通配符或以其他方式概括路径的方法,以使它们不受这些增量的影响?

任何帮助将不胜感激,伙计们!

最佳答案

由于默认的 DataTable ItemReuseStrategy,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)
}

}
}
})
}

关于java - 使用 Wicket Tester 时如何在单元测试中保持组件路径不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10261839/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com