JUnit-test Versagen, obwohl erwartete exception geworfen wird
Ich kann nicht scheinen, um herauszufinden, warum einer meiner tests fehlschlägt.
Hier ist der test:
@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));
}
Habe ich einen Haltepunkt setzen und gegangen durch den Prozess mehrere Male. Es geht in die zweite wenn-Anweisung in der ChessPiece
Klasse, und scheint die Ausnahmen. Der Prozess geht dann zurück zum Rook
Klasse aus und gibt false zurück unter die super
block.
Alle Ideen, was ist passiert? Dank
Relevante code:
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();
}
}
- Es ist sehr schwer, zu verstehen, was Los ist, nur aus der teilweisen code, den Sie gegeben haben. Können Sie vereinfachen, es auf ein kurzes, aber vollständiges Beispiel? Und wenn Sie erwarten, dass
isValidMove
eine Ausnahme, warum sollte Sie auch haben, eine Behauptung (die Sie nicht erreichen)? - Ach ja, und deine
ChessPiece.isValidMove
Umsetzung ist Ungültiger code - es nichts zurückgibt. Schlägt vor, dass Sie nicht die Ausführung des Codes die du gepostet hast. - Was bedeutet die testfailure sagen?
- Sicher, ich habe gespart, weil ich nicht wollen Seiten code. Dies ist ein Spiel des Schachs. Was hier passiert ist, Teste ich meine move-Methode. Ich bin Platzierung einer neuen Marke rook an einer Stelle und dann versuchen zu bewegen, ein anderes "Stück" von dieser position. Ich bin mir nicht sicher, warum die Behauptung ist da, der test wurde von meinem Lehrer. Und das ist nicht die ganze Spielmarke.isValidMove, nur Teile relevant für diesen test.
- Ich erhalte die Meldung "java.lang.AssertionError:Expected exception: java.lang.IllegalArgumentException
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was geschieht, ist die erste Zeile in der
isValidMove()
vonRook
- Klasse ruftsuper
Methode, so die Kontrolle geht es, aber aufgrund des Zustands des zweitenif
nicht erfüllt werden, es wirftIllegalArgumentException
und dann die Kontrolle wieder zurück zu Kind-Klasse ieRook
und es kann nichtreturn false
jetzt als super hat eine Ausnahme geworfen, so wird die Ausnahme erneut geworfen, die außerhalb von dieser Methode und wird erneut geworfen von junitcomplainsIfFromLocIsDifferentObject
Methode.Diese wird verstanden werden durch die JUnit-framework und sollte den test bestehen, Fall.
Prüfen wenn Sie diese Zeile
@RunWith(value = BlockJUnit4ClassRunner.class)
im test-case-Klasse.UPDATE:
Dieser Testfall geht für mich.
@RunWith(value = BlockJUnit4ClassRunner.class)
diese stattdessen zu verwendenAssertion Error Exception expected
ich denke, irgendwo gibt es einetry{}catch{}
block, der die exception zu fangen und false zurückgeben, statt zu werfen Ausnahme. Überprüfen Sie für das auch.Wie Sie schreiben in einem Kommentar JUnit sagt Ihnen, was falsch ist:
Erhalten Sie eine AssertionError, wahrscheinlich aus einer Behauptung, bevor die erwartete exception wird geworfen, oder weil die Ausnahme wird behandelt und dann eine assertion durchgeführt, die fehlschlägt.
Wenn Sie entfernen die 'erwartet' mit dem Wert aus der JUnit-annotation geben Sie den genauen Ort, wo die assertion fehlgeschlagen (ein.k.ein. stacktrace)
Normalerweise würde ich nicht setzen JUnit-assertions um code, den ich erwarten, dass die Ausnahme zu werfen.
So
Ansonsten wird die Ausnahme ausgelöst wird, innerhalb des JUnit-assert-Anweisung, die umschließt die Ausnahme in einer assertionException.
@Test(expected = IllegalArgumentException)
Wert rechnen muss konstant sein. Dies ist also keine richtige Art, mit @Test. Der richtige Weg ist@Test(expected = IllegalArgumentException.class)