1. ホーム
  2. java

[解決済み] JUnit テストで期待した例外がスローされたが失敗する

2022-02-19 16:29:35

質問

あるテストがなぜ失敗するのか、その原因がわからないようです。

以下がそのテストです。

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

解決方法は?

<ブロッククオート

ChessPieceクラスの2番目のif文に入ります。 は例外を投げるようです。その後、処理はRookに戻り クラスで、スーパーブロックの下で false を返します。

何が起こっているかというと、最初の行の isValidMove()Rook クラスコール super メソッドで制御されますが、2番目の if がスローされます。 IllegalArgumentException そして、制御は子クラスに戻り、すなわち Rook であり、それは return false super が例外をスローしたので、例外はこのメソッドの外側で再度スローされ、junit からは再度スローされます。 complainsIfFromLocIsDifferentObject メソッドを使用します。

これはJUnitフレームワークによって理解され、テストケースを通過するはずです。

次の行があるかどうか確認してください。 @RunWith(value = BlockJUnit4ClassRunner.class) をテストケース・クラスに追加してください。

UPDATEです。

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

このテストケースは私にとっては合格です。