9

特定のメソッドがメソッドから予想される例外をスローすることをテストしようとしています。JUnit4のドキュメントとこの回答に従って、テストを次のように記述しました。

@Test(expected=CannotUndoException.class)  
public void testUndoThrowsCannotUndoException() {   
    // code to initialise 'command'

    command.undo();
}

ただし、このコードは JUnit テストに失敗し、スローされた (そして予想される) 例外をエラーとして報告します。

私がテストしているメソッドには、本体にこれだけがあります:

public void undo() {
    throw new CannotUndoException();
}

さらに、次のテストに合格します。

public void testUndoThrowsCannotUndoException() {
    // code to initialise 'command'

    try { 
        command.undo();
        fail();
    } catch (CannotUndoException cue){

    }
}

予想される例外が実際にスローされることを意味します。

私は実際にメソッドを変更して、例外をスローするのではなく、実際に何かを実行することを計画していますが、問題の原因が何かに興味を持っています。

次のチェックが行われました。

  • テスト ケースにインポートされた CannotUndoException は正しいものです
  • JUnit のバージョン 4 は、私のクラスパスにある唯一のものです
  • Eclipseワークスペースをクリーンアップしてビルドしても結果は変わりませんでした

私は JUnit 4.1 を使用しており、同じテストで Mockito を使用しています。

誤った障害の原因は何ですか?

4

4 に答える 4

10

問題が見つかりました。

私が使用していた TestRunner は正しいもの (JUnit 4) でしたが、テスト クラスを次のように宣言しました。

public class CommandTest extends TestCase

テストランナーがそれをJUnit 3テストとして扱うようになっていると思います。削除extends TestCaseして、期待される結果を受け取りました。

于 2008-12-27T20:33:22.680 に答える
3

あなたのテストコードは私には問題ないようです。

junit 3.8 テストランナーではなく、junit 4 テストランナーで実行していることを確認してください。これが原因である可能性が非常に高いです (コマンド ラインから起動するか、テストの実行時にコマンド ラインを視覚的に調べます)。テストランナーのクラスパスは、プロジェクトのクラスパスと同じではない可能性があります

これは特に IDE 内で当てはまります。または、junit 4.4 にプッシュして、問題が解決するかどうかを確認することもできます。(junit 4.5 は他の問題を引き起こす可能性があります)。

于 2008-12-27T19:44:49.440 に答える
1

同様の問題が発生し、注釈を追加して修正しました

@RunWith(JUnit4ClassRunner.class)

これは、ユニットテスターに​​4erバージョンのJunitで実行するように指示します

于 2009-01-20T23:39:24.027 に答える
0

奇妙。

私は3つのクラスを書きました:

UndoCommand:

public class UndoCommand
{
    public void undo()
    {
        throw new CannotUndoException();
    }
}

CannotUndoException:

// Note: extends the unchecked superclass RuntimeException
public class CannotUndoException extends RuntimeException
{
    public CannotUndoException()
    {
        super();
    }

    public CannotUndoException(String message)
    {
        super(message);
    }

    public CannotUndoException(String message, Throwable cause)
    {
        super(message, cause);
    }

    public CannotUndoException(Throwable cause)
    {
        super(cause);    
    }
}

JUnit 4.4 テスト クラス:

import org.junit.Test;

public class UndoCommandTest
{
    @Test(expected=CannotUndoException.class)
    public void testUndo()
    {
        UndoCommand command = new UndoCommand();

        command.undo();
    }
}

完全に機能します - すべてのテストに合格し、「緑色」の結果が得られます。

注釈から (expected=...) を削除すると、予想どおり、テストは失敗します。

Sun JDK 6、JUnit 4.4、および IntelliJ 7.0.5 を使用しています。

あなたのものはどう違うのですか?

于 2008-12-27T19:46:49.547 に答える