Java 使用JUnit 4'的意外行为的原因;预期的异常机制是什么?

Java 使用JUnit 4'的意外行为的原因;预期的异常机制是什么?,java,unit-testing,exception,junit4,Java,Unit Testing,Exception,Junit4,我试图测试一个特定的方法是否从一个方法中抛出一个预期的异常。根据JUnit4文档,我将测试编写为: @Test(expected=CannotUndoException.class) public void testUndoThrowsCannotUndoException() { // code to initialise 'command' command.undo(); } 但是,此代码未通过JUnit测试,将抛出(和预期的)异常报告为错误 我正在测试的方法只

我试图测试一个特定的方法是否从一个方法中抛出一个预期的异常。根据JUnit4文档,我将测试编写为:

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

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

我正在测试的方法只有以下内容:

public void undo() {
    throw new CannotUndoException();
}
此外,以下测试通过:

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

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

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

实际上,我正计划更改方法以实际执行某些操作,而不是仅仅抛出异常,但这让我好奇是什么导致了问题,以免将来再次发生

已进行以下检查:

  • 导入到测试用例中的CannotUndoException是正确的
  • JUnit的版本4是我的类路径上唯一的版本
  • 一个干净的Eclipse工作区构建并没有改变结果
我使用的是JUnit4.1,在同一测试中,我使用的是Mockito


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

我认为您的测试代码正常

检查您运行的是junit 4 testrunner,而不是junit 3.8 testrunner——这很可能是罪魁祸首(请尝试从命令行启动,或者在运行测试时直观地检查命令行)。testrunner的类路径可能与项目类路径不同

IDE内部尤其如此。或者,您也可以尝试推到JUnit4.4,看看这是否解决了您的问题。(JUnit4.5可能会导致其他问题)。

我写了三节课:

撤消命令:

public class UndoCommand
{
    public void undo()
    {
        throw new CannotUndoException();
    }
}
无法撤消的异常:

// Note: extends the unchecked superclass RuntimeException
public class CannotUndoException extends RuntimeException
{
    public CannotUndoException()
    {
        super();
    }

    public CannotUndoException(String message)
    {
        super(message);
    }

    public CannotUndoException(String message, Throwable cause)
    {
        super(message, cause);
    }

    public CannotUndoException(Throwable cause)
    {
        super(cause);    
    }
}
和JUnit 4.4测试类:

import org.junit.Test;

public class UndoCommandTest
{
    @Test(expected=CannotUndoException.class)
    public void testUndo()
    {
        UndoCommand command = new UndoCommand();

        command.undo();
    }
}
工作完美-所有测试均通过“绿色”结果

如果我从注释中删除(预期=…),测试将失败,正如预期的那样

我正在使用Sun JDK 6、JUnit 4.4和IntelliJ 7.0.5


你的有什么不同?

我发现了问题所在

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

public class CommandTest extends TestCase

我认为这会导致测试运行程序将其视为JUnit3测试。我删除了
扩展测试用例
,并收到了预期的结果

我有一个类似的问题,我通过添加注释修复了它

@RunWith(JUnit4ClassRunner.class)

它告诉单元测试人员使用4er版本的Junit运行它。代码完全相同,甚至是自定义异常代码。我正在运行Sun JDK 5、JUnit 4.1和Eclipse 3.2,但是,我认为可能是Eclipse中的一个设置实现了这一点,因为我今天添加了JUnit库,可能错过了测试运行程序的一个设置,正如krosenvold所说。非常好。当我读到你的问题时,他的答案不在那里。编写、编译、运行和发布代码需要一两分钟。在那个时候,另一个答案出现了。请原谅我得到了一点特定于日食的。。。我转到了进程中测试的运行配置,测试运行程序被标记为JUnit4。我想知道他们是否在某个时候搞混了,我现在不得不担心,因为这不是默认的Eclipse发行版!谢谢。+1为上述问题提供了很好的见解,但是,我不能接受答案,因为这不是根本原因。谢谢:-)通常情况下,“向我们展示代码”可以避免咬牙切齿:-)也许你想将问题标记为已回答。