9

我正在尝试测试特定方法是否会从方法中引发预期的异常。根据 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 工作区并没有改变结果

我使用的是 JUnit 4.1,在同一个测试中我使用的是 Mockito。

什么可能导致错误失败?

4

4 回答 4

10

我发现了问题。

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

public class CommandTest extends TestCase

我认为这导致测试运行程序将其视为 JUnit 3 测试。我删除extends TestCase并收到了预期的结果。

于 2008-12-27T20:33:22.680 回答
3

您的测试代码对我来说看起来不错。

检查您是否正在使用 junit 4 测试运行程序,而不是 junit 3.8 测试运行程序 - 这很可能是这里的罪魁祸首(尝试从命令行启动或在运行测试时目视检查命令行)。您的测试运行程序的类路径可能与您的项目类路径不同

在 IDE 中尤其如此。或者,您也可以尝试推送到 junit 4.4,看看是否能解决您的问题。(junit 4.5 可能会导致其他问题)。

于 2008-12-27T19:44:49.440 回答
1

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

@RunWith(JUnit4ClassRunner.class)

它告诉单元测试人员使用 4er 版本的 Junit 运行它

于 2009-01-20T23:39:24.027 回答
0

好奇的。

我写了三个类:

撤消命令:

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();
    }
}

完美运行 - 所有测试均通过,“绿色”结果。

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

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

你的有什么不同?

于 2008-12-27T19:46:49.547 回答