Java 使用JUnit 4'的意外行为的原因;预期的异常机制是什么?
我试图测试一个特定的方法是否从一个方法中抛出一个预期的异常。根据JUnit4文档,我将测试编写为: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测试,将抛出(和预期的)异常报告为错误 我正在测试的方法只
@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 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为上述问题提供了很好的见解,但是,我不能接受答案,因为这不是根本原因。谢谢:-)通常情况下,“向我们展示代码”可以避免咬牙切齿:-)也许你想将问题标记为已回答。