16

テストの 1 つが失敗する理由がわかりません。

テストは次のとおりです。

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

ブレークポイントを設定し、プロセスを複数回実行しました。クラスの 2 番目の if ステートメントに入りChessPiece、例外がスローされるようです。その後、プロセスはクラスに戻り、ブロックRookの下で false を返します。super

何が起こっているかについてのアイデアはありますか?ありがとう

関連コード:

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

3 に答える 3

10

ChessPiece クラスの 2 番目の if ステートメントに入り、例外がスローされるようです。その後、プロセスは Rook クラスに戻り、スーパー ブロックの下で false を返します。

何が起こっているかというと、クラス呼び出しメソッドの最初の行でisValidMove()制御Rooksuperそこに行きますが、2 番目の条件ifが満たされていないため、それがスローさIllegalArgumentExceptionれ、制御が子クラスに戻ります。つまり、スーパーが例外をスローしたため、現在はRookできません。return false例外は、このメソッドの外部で再スローされ、junitcomplainsIfFromLocIsDifferentObjectメソッドから再スローされます。

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

このテスト ケースは合格です。

于 2013-03-08T07:07:50.883 に答える
7

コメントに書くと、JUnit は何が間違っているかを教えてくれます。

「java.lang.AssertionError:Expected exception: java.lang.IllegalArgumentException」が表示されます

おそらく、予想される例外がスローされる前のアサーションから、または例外が処理されてからアサーションが実行されて失敗したため、AssertionError が発生します。

アノテーションから「期待される」値を削除すると、JUnit はアサーションが失敗した正確な場所 (別名スタックトレース) を提供します。

于 2013-03-08T08:09:30.300 に答える
-1

通常、例外がスローされると予想されるコードの周りに JUnit アサーションを配置しません。

そう

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

それ以外の場合、例外は assertionException で例外をラップする JUnit assert ステートメント内でスローされます。

于 2013-03-08T08:15:07.993 に答える