有关@override方法的junit测试用例

时间:2013-02-25 09:51:44

标签: java junit4

我正在研究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等方法?

2 个答案:

答案 0 :(得分:0)

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

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

但是,如果这是必需的,则至少有两个选项 -

  1. 不要为处理程序使用匿名内部类 - 在同一个程序包中为它们命名。
  2. 使用类似Powermock和JUnit的模拟框架,并传递模拟的SWT事件对象来调用处理程序,以便覆盖。

答案 1 :(得分: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。您的单元测试没有GUI。所以,你的m_rightFrame可能是null(即使它不是,底层的AWT类也是如此)。