0

2つの異なる例外をスローするメソッドをテストしています。これは私のヘッダーです:

@Test (expected = A8InvalidInputException.class)
public void testGuessCharacter() throws A8InvalidInputException, A8AlreadyGuessedException { ... }

本文には、例外ごとに1つずつ、2つのtry / catchブロックがあります(SOで検索すると、例外がスローされることをテストする方法であるという投稿が表示されました)。特に、期待される属性は1つしかないため、これを2つのテスト方法に分割する必要があるように思われます。ただし、これを行うと、A8InvalidInputExceptionをテストすることになっているメソッドはA8AlreadyGuessedExceptionのtry / catchを必要とし、A8AlreadyGuessedExceptionをテストすることになっているメソッドはA8InvalidInputExceptionのtry/catchを必要とします。このテストの書き方がよくわかりません。これは私がテストしようとしている方法です:

/**
 * This method returns whether a specified character exists in the keyPhrase field
 * @param guess  a character being checked for in the keyPhrase field
 * @return  returns whether a specified character exists in the keyPhrase field
 * @throws A8InvalidInputException  if a non-valid character is passed as input to this method
 * @throws A8AlreadyGuessedException  if a valid character which has already been guessed is passed as input to this method
 */
public boolean guessCharacter(char guess) throws A8InvalidInputException, A8AlreadyGuessedException
{
    if(isValidCharacter(guess))
    {
        guess = Character.toLowerCase(guess);

        if(guessedCharacters.contains(guess) )
        {
            throw new A8AlreadyGuessedException("" + guess);
        }
        else
        {
            guessedCharacters.add(guess);
            if(keyPhrase.contains("" + guess))
                return true;
            else
            {
                numberOfGuessesLeft--;
                return false;
            }
        }       
    }
    else
    {
        throw new A8InvalidInputException("" + guess);
    }
}
4

4 に答える 4

6

throws 句に両方の例外を追加するだけです。

@Test (expected = A8InvalidCharacterException.class) 
public void testInvalidCharacterScenario() throws A8InvalidInputException, A8AlreadyGuessedException { ... }

@Test (expected = A8InvalidInputException.class) 
public void testInvalidInputScenario() throws A8InvalidInputException, A8AlreadyGuessedException { ... }

次に、1 つのテストが他の例外 (予期しないもの) をスローすると、テストは自動的に失敗します。

于 2013-03-09T22:42:03.637 に答える
4

メソッドは、実行時に例外を 1 つだけスローできます。そのため、予想される属性は 1 つしかありません。

3 つのテスト ケースが必要な場合があります。1 つはメソッドが 1 つの例外をスローする場合、もう 1 つはメソッドが別の例外をスローする場合、もう 1 つはメソッドが例外をまったくスローしない場合です。

メソッドにtry/catch ステートメントを入れないでください@Test。例外をスローすることを宣言するだけです。

于 2013-03-09T22:43:16.770 に答える
2

はい、これを 2 つの単体テストに分割する必要があります。1 つは無効な入力で をトリガーしA8InvalidInputException、もう 1 つは「既に推測された」入力で をトリガーしA8AlreadyGuessedExceptionます。

于 2013-03-09T22:40:06.180 に答える
1

テストの作成をもう少し簡単にするために、テストを 2 つの異なる部分 (テストisValidCharacterguessCharacter個別のテスト) に分割することを検討してください。

無効な推測を受け取った場合に失敗すると仮定すると、そのメソッドをスローするのが理想的isValidCharacter(guess)だと思います。A8InvalidInputException

public boolean isValidCharacter(char guess) throws A8InvalidInputException {
    // have your logic to check the guess, and if it's invalid, throw
}

次に、その特定のメソッドをテストして、偽の入力で例外がスローされるかどうかを確認するだけです。

@Test (expected = A8InvalidInputException.class)
public void testIsValidCharacterWithInvalidCharacter() {
    // write your test here.
}

次に、メソッドのハッピー パスのみを気にするようにメソッドを変更できますisValidCharacter。ブール値を返さない場合は、例外がスローされたことになるからです。

最後に、guessCharacterそれが をスローするかどうかの周りのテストだけに関心がありますA8AlreadyGuessedException

@Test (expected = A8AlreadyGuessedException.class)
public void testGuessCharacterWithAlreadyGuessedValue() {
    // write your test here.
}
于 2013-03-09T22:59:14.123 に答える