0

我正在研究 Junit 测试用例,评分方案基于代码的覆盖率。我在方法中遇到了一些@override 方法的问题,因为我似乎无法调用该方法。就像下面的例子一样。

public void showFollowersList(PagableResponseList<User> followers) {
  m_itemList.addListener(SWT.Resize, new Listener() {
  @Override
  public void handleEvent(Event arg0) {
    m_itemList.setLayoutData(new RowData(m_itemList.getBounds().width, 
                                         m_itemList.getBounds().height));
    m_rightFrame.layout();
    m_rightFrame.pack();
  }
});
}

addMouseTrackListener(new MouseTrackListener() {
  @Override
  public void mouseHover(MouseEvent arg0) {
  }

  @Override
  public void mouseExit(MouseEvent arg0) {
    Rectangle rect = HoverClickableComposite.this.getClientArea();
    if (!m_clicked && !rect.contains(arg0.x, arg0.y)) {
      setBackground(m_origColor);
    }
  }

如何调用或覆盖诸如 handleEvent 、 mouseExit 和 mouseHover 之类的方法?

4

2 回答 2

0

showFollowersList如果有帮助,我认为有人在使不可测试方面做得很好。这是故意的吗?

如果是这样,正确的答案实际上可能不是一组测试代码,而是一个非常低的覆盖分数和一个更改类以使其更具可测试性的建议列表......

目前测试它的唯一方法是设置,戳它,然后检查会发生什么。只有当您可以handleEvent在您的对象上触发调用,并且类上可以使用某些方法时,这才有效:getListgetListenerCount等。然后,类似于:

testObject.showFollowersList(followers);
// All that method does is add listener. So check that listener got added
assertEquals(1, testObject.getList().getListenerCount());

// Now check that inner handlers behave correctly
testObject.getList().fireEvent();
// This should have created a new RowData in the list
assertNotNull(testObject.getList().getLayoutData());

但是,如果您没有这些方法可用,那么添加它们并List仅仅为了单元测试而公开它们绝对不是一个好主意。

另一个问题是图形用户界面。您的单元测试将没有 GUI。因此,您m_rightFrame可能会为 null(即使不是,底层 AWT 类也将是)。

于 2013-02-25T10:31:14.147 回答
0

它不是“方法内部”的方法,而是匿名类的方法。

通常,对于 SWT 或 Swing 编程,需要大量测试覆盖的是代码的功能(业务)方面,而不是脚手架(处理程序等)。

但是,如果这是必需的,至少有两种选择 -

  1. 不要为处理程序使用匿名内部类 - 在同一个包中给它们命名。
  2. 将类似 Powermock 的模拟框架与 JUnit 一起使用,并将模拟的 SWT 事件对象传递给调用处理程序,以便您进行覆盖。
于 2013-02-25T10:00:47.970 回答