java – NatTable的JUnit测试

我想做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的问题,为开发人员提供最大的定制灵活性.

点赞