使用JUnit 4的预期异常机制导致意外行为的原因?

Gru*_*eck 9 java unit-testing exception junit4

我试图测试一个特定的方法从方法抛出预期的异常.根据JUnit4文档和这个答案,我把测试编写为:

@Test(expected=CannotUndoException.class)  
public void testUndoThrowsCannotUndoException() {   
    // code to initialise 'command'

    command.undo();
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码未通过JUnit测试,将抛出(和预期)异常报告为错误.

我正在测试的方法在体内只有这个:

public void undo() {
    throw new CannotUndoException();
}
Run Code Online (Sandbox Code Playgroud)

此外,以下测试通过:

public void testUndoThrowsCannotUndoException() {
    // code to initialise 'command'

    try { 
        command.undo();
        fail();
    } catch (CannotUndoException cue){

    }
}
Run Code Online (Sandbox Code Playgroud)

意味着实际抛出了预期的异常.

我实际上计划将方法更改为实际执行某些操作,而不是仅仅抛出异常,但是让我对导致问题的原因感到好奇,以免将来再次发生.

已进行以下检查:

  • 导入到测试用例中的CannotUndoException是正确的
  • JUnit的第4版是我的类路径中唯一的一个
  • 干净并构建Eclipse工作区并未改变结果

我正在使用JUnit 4.1,并且在同一测试中我正在使用Mockito.

什么可能导致错误的失败?

Gru*_*eck 10

我发现了这个问题.

我使用的TestRunner是正确的(JUnit 4),但是,我将我的测试类声明为:

public class CommandTest extends TestCase
Run Code Online (Sandbox Code Playgroud)

我假设它导致测试运行器将其视为JUnit 3测试.我删除extends TestCase并收到了预期的结果.