虽然引发了预期的异常,但JUnit测试失败

时间:2013-03-08 06:53:51

标签: java testing

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

以下是测试:

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

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

有关正在发生的事情的任何想法?感谢

相关代码:

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

3 个答案:

答案 0 :(得分:5)

  

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

正在发生的事情是isValidMove()Rook类调用super方法的第一行,因此控制权在那里,但由于第二个if的条件不存在遇到它抛出IllegalArgumentException,然后控制返回到子类即Rook,它现在不能return false,因为super已抛出异常,因此异常将从此方法重新抛出,并将从junit complainsIfFromLocIsDifferentObject方法重新抛出。

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

此测试用例传递给我。

答案 1 :(得分:3)

当您在评论中写道时,JUnit会告诉您错误:

  

我得到&#34; java.lang.AssertionError:预期的异常:java.lang.IllegalArgumentException

你得到一个AssertionError,可能是在抛出预期异常之前的一个断言,或者是因为处理了Exception,然后执行了一个失败的断言。

如果您删除了预期的&#39;注释JUnit中的值将为您提供断言失败的确切位置(a.k.a. stacktrace)

答案 2 :(得分:0)

通常我不会将JUnit断言放在我希望抛出异常的代码周围。

所以

@Test(expected = IllegalArgumentException)
public void test() {
   board.set(make(), 1, 3); //Creates different rook from 'piece'
   piece.isValidMove(getValidMove(1, 3), board);
}

否则,在JUnit assert语句中抛出异常,该语句将异常包装在assertionException中。