Java 关于@override方法的junit测试用例

Java 关于@override方法的junit测试用例,java,junit4,Java,Junit4,我正在编写Junit测试用例,评分方案基于代码的覆盖率。 我遇到了一个关于方法中某个@override方法的问题,因为我似乎无法调用该方法。 就像下面的例子一样 public void showFollowersList(PagableResponseList<User> followers) { m_itemList.addListener(SWT.Resize, new Listener() { @Override public void handleEvent(Ev

我正在编写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);
    }
  }
public void showFollowersList(PagableResponseList追随者){
m_itemList.addListener(SWT.Resize,new Listener()){
@凌驾
公共无效handleEvent(事件arg0){
m_itemList.setLayoutData(新的行数据(m_itemList.getBounds().width,
m_itemList.getBounds().height));
m_rightFrame.layout();
m_rightFrame.pack();
}
});
}
addMouseTrackListener(新的MouseTrackListener(){
@凌驾
公共无效鼠标悬停(鼠标事件arg0){
}
@凌驾
public void mouseExit(MouseEvent arg0){
矩形rect=HoverClickableComposite.this.getClientArea();
如果(!m_单击&!rect.contains(arg0.x,arg0.y)){
退避地(原色);
}
}

如何调用或覆盖handleEvent、mouseExit和mouseHover等方法?

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

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

然而,如果这是必需的,至少有两种选择:

  • 不要对处理程序使用匿名内部类-在同一个包中为它们命名
  • 在JUnit中使用类似Powermock的模拟框架,并传递模拟的SWT事件对象来调用处理程序,这样您就有了覆盖范围

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

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

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

    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());
    
    但是如果你没有这些方法可用,那么仅仅为了单元测试而添加它们并公开
    列表绝对不是一个好主意

    另一个问题是GUI。您的单元测试将没有GUI。因此,
    m_rightFrame
    可能为空(即使不是空的,底层AWT类也将为空)