我想做NatTable内容的简单UI测试(即,不使用SWTBot或其他UI测试框架).
我的方法是创建一个shell,添加我的自定义NatTable然后访问单元格并检查其内容(数据值,配置标签等):
// Note: this is Xtend code
@Before
def void setup()
{
shell = new Shell(Display.getCurrent)
shell.layout = new FillLayout
parent = new Composite(shell, SWT.NONE)
parent.layout = new GridLayout
fixture = new MyNatTableViewer(parent) // this is my custom nattable impl under test
shell.pack
shell.visible = true
}
@Test
def void testLabel()
{
assertCellLabel(2, 2, "test-label");
}
def assertCellLabel(int row, int col, String expected)
{
val labels = parameterTable.getCellByPosition(col, row)?.configLabels
assertThat(labels).describedAs("Labels for row " + row + " col " + col).isNotNull
assertThat(labels.labels).describedAs("Labels for row " + row + " col " + col).contains(expected)
}
要测试我的其他组件,只需创建shell和父组合即可;我的测试工作不需要包装和设置可见.
然而,使用NatTable,如果单元格不可见,getCellByPosition()将返回null – 所以我添加了代码来打包并将shell设置为可见.这适用于小表(包含2行和几列).
可悲的是,它不适用于大型桌子.我怀疑这是因为视口层不会创建不在可见区域中的单元格(我知道,NatTable的强度 – 它只按需创建所需的结构).当然,这对于正常运行时行为是期望的.
但是有没有(另一种)方式以有保证的方式获得细胞(换句话说,我可以让NatTable / ViewportLayer相信细胞是可见的,所以只要细胞存在内容,我就不会得到null ?)
当然,我可以直接测试我的标签累加器,数据提供者等,但我想从黑盒的角度来看待这个问题.
最佳答案 这个问题本身就是矛盾的.您要求使用黑盒方法来测试NatTable,但是您想要在测试时更改NatTable的行为.那不是一个黑盒子的方法!
如果您真的想要使用黑盒方法进行测试,则需要确保呈现单元格.这可以通过触发滚动来完成,例如,通过执行ShowCellInViewportCommand.这是真正的黑盒方法,因为为不可见单元格返回null是正确的结果.
如果你需要在真正的黑盒方法和利用内部知识(你要求的)的方法之间的东西,你必须有方法到达那里.
>在ViewportLayer下面的图层上操作.通常可以使用SelectionLayer.但当然这不需要任何意义,因为图层堆栈可能因设置而异. ViewportLayer是将虚拟特性引入NatTable和滚动功能的视图.它避免了对底层的访问.因此,询问其中一个将返回您期望的值.
>通过执行TurnViewportOffCommand禁用ViewportLayer.这基本上是一个黑客攻击,可以触发你可能不想要的后面的其他东西.但我在其他情况下已经看到了这个建议,因此想在这里命名.无论如何我不建议使用它!
请注意,当我们讨论黑盒测试时,这两种方法更像是黑客攻击,因为您正在对组合进行假设.由于各种配置能力,它们一般不能应用.
关于为什么需要设置Shell可见的隐藏问题.好吧,主要是因为需要触发绘画和调整大小的SWT事件,以便根据Shell状态正确地开始大小计算和打印NatTable.在我们的例子中(也是普通的SWT),我们称之为Shell#open().
作为对您的实现的最后评论,我不明白您为什么要对NatTable进行子类化.我们的API从未打算这样做.我想你这样做是为了做一些静态预配置,例如图层堆栈.但我个人不喜欢这种方法.每当有人扩展我们的类以覆盖一些内部方法时,它最终会出现在问题或错误报告中,因为行为会发生变化.但我认为这通常是一个开放API的问题,为开发人员提供最大的定制灵活性.