首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NatTable的JUnit测试

NatTable的JUnit测试
EN

Stack Overflow用户
提问于 2016-04-27 11:17:34
回答 2查看 335关注 0票数 4

我希望对SWTBot内容进行简单的UI测试(即不使用NatTable或其他UI测试框架)。

我的方法是创建一个shell,添加自定义的NatTable,然后访问单元格并检查其内容(数据值、配置标签等):

代码语言:javascript
复制
// 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 --因此我添加了打包代码并将外壳设置为可见的。这适用于小表(有2行和几列)。

遗憾的是,它不适用于大桌子。我怀疑这是因为视口层没有创建不在可见区域的单元格(我知道,这是NatTable的强度--它只根据需要创建所需的结构)。当然,这是正常运行时行为所需要的。

但是,是否有(另一种)方法可以保证以一种保证的方式获得单元格(换句话说,我是否可以让NatTable/ViewportLayer相信该单元格是可见的,这样只要单元格存在内容,我就不会得到null )?

当然,我可以直接测试我的标签累加器、数据提供者等,但是我想从黑匣子的角度来更多地处理这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-28 07:18:40

这个问题本身是矛盾的。您需要一种用于测试NatTable的黑匣子方法,但您希望在测试时更改NatTable的行为。那不是黑匣子的方法!

如果确实希望使用黑匣子方法进行测试,则需要确保呈现单元格。这可以通过触发滚动来实现,例如通过执行ShowCellInViewportCommand。这是真正的黑匣子方法,因为对不可见单元格返回null是正确的结果。

如果你需要一种真正的黑箱方法和一种利用内部知识(这是你所要求的)之间的东西,你必须找到方法去达到这个目的。

  1. ViewportLayer下面的一个层上操作。通常可以使用SelectionLayer。当然,这不需要任何意义,因为层堆栈可能因设置不同而有所不同。ViewportLayer是将虚拟性质引入到NatTable和滚动能力的系统。它避免了对底层的访问。因此,询问其中之一将返回您所期望的值。
  2. 通过执行ViewportLayer禁用TurnViewportOffCommand。这基本上是一个黑客,并可能触发额外的东西在背后,你可能不想要。但我在其他情况下看到了这一建议,因此想在这里提出它。反正我也不建议你用!

请注意,当我们讨论黑匣子测试时,这两种方法更像黑客,因为您是在对组合进行假设。由于配置能力的不同,它们一般不能应用。

关于为什么需要将Shell设置为可见的隐藏问题。基本上,因为需要触发用于绘制和调整大小的SWT事件,以便根据Shell状态正确地启动NatTable的大小计算和打印。在我们的示例(也是普通的SWT)中,我们称之为Shell#open()

作为对您的实现的最后一点评论,我不明白您为什么要将NatTable划分为子类。我们的API从未打算这样做。我想你这样做是为了做一些静态的预配置,例如层堆栈。但就我个人而言,我不喜欢这种方式。每当有人扩展我们的类以覆盖某些内部方法时,它就会出现问题或错误报告,因为行为会发生变化。但我认为,这通常是一个开放API的问题,以使开发人员在定制方面获得最大的灵活性。

票数 1
EN

Stack Overflow用户

发布于 2016-06-23 08:38:38

我也试图从不可见的细胞中读取数据。我试图按以下方式使用ShowCellInViewportCommand:

代码语言:javascript
复制
widget.doCommand(new ShowCellInViewportCommand(gridlayer.getBodyLayer(), column, row)); 
//where row is say 50 and column is 20 and the cell is invisible.

我也试过,

代码语言:javascript
复制
widget.doCommand(new ShowRowInViewportCommand(widget.getLayer(), row)); 
//here the default value given by nattable.getLayer is passed

小部件会腐蚀到可攻击的实例。

调用之后,UI中什么都不会发生。单元格不显示。我还需要做什么吗?

我该如何去读不可见的细胞。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36888212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档