JUnit 测试失败,尽管会引发预期的异常

2022-09-03 06:59:32

我似乎无法弄清楚为什么我的一个测试失败了。

测试如下:

@Test(expected = IllegalArgumentException.class)
public void complainsIfFromLocIsDifferentObject() throws Throwable {
    board.set(make(), 1, 3); //Creates different rook from 'piece'
    assertFalse("ChessPiece Test 2", piece.isValidMove(getValidMove(1, 3), board));
}

我已经设置了一个断点,并多次完成该过程。它进入类中的第二个 if 语句,并且似乎抛出异常。然后,该过程返回到类,并在块下返回 false。ChessPieceRooksuper

关于正在发生的事情有什么想法吗?谢谢

相关代码:

public class Rook extends ChessPiece {

    @Override
    public boolean isValidMove(Move m, IChessBoard b) {
        if (super.isValidMove(m, b) == false)
            return false;

        // Add logic specific to rook
        if(m.fromRow == m.toRow || m.fromColumn == m.toColumn)
            return true;
        else 
            return false;
    }
}


public abstract class ChessPiece implements IChessPiece {

    @Override
    public boolean isValidMove(Move m, IChessBoard b) {

        //Verify that there is a piece at the origin
        if (b.pieceAt(m.fromRow,m.fromColumn) == null)
            throw new IllegalArgumentException();

        // Verify that this piece is located at move origin
        IChessPiece piece = b.pieceAt(m.fromRow, m.fromColumn);
        if (this != piece)
            throw new IllegalArgumentException();
     }
}

答案 1

它进入 ChessPiece 类中的第二个 if 语句,并且似乎抛出了异常。然后,该过程返回到 Rook 类,并在超级块下返回 false。

正在发生的事情是类调用方法中的第一行,因此控件在那里,但是由于不满足第二个条件,它抛出,然后控件返回到子类,即它现在不能,因为超级已经抛出了异常,所以异常将从此方法重新抛出,并将从junit方法重新抛出。isValidMove()RooksuperifIllegalArgumentExceptionRookreturn falsecomplainsIfFromLocIsDifferentObject

这将由 JUnit 框架理解,并且应该通过测试用例。

检查测试用例类中是否有此行。@RunWith(value = BlockJUnit4ClassRunner.class)

更新:

@RunWith(value = BlockJUnit4ClassRunner.class)
public class Test extends TestCase{

    @Test(expected = IllegalArgumentException.class)
    public void test1() throws Throwable{
        assertFalse(throwException());
    }

    private boolean throwException(){
        throw new IllegalArgumentException();
    }
}

这个测试用例对我来说通过了。


答案 2

当你在评论中写时,JUnit告诉你出了什么问题:

我得到 “java.lang.AssertionError:Expected exception: java.lang.IllegalArgumentException

您会得到一个 AssertionError,可能来自引发预期异常之前的断言,或者因为处理了 Exception,然后执行了失败的断言。

如果从注释中删除“预期”值,JUnit 将为您提供断言失败的确切位置(也称为堆栈跟踪)