2016-04-20 3 views
1

Assert.assertTrue(true)を使うのが良いか悪いのですか。 JUnitテストのAssert.fail()とその理由

@Test(expected = Exception.class)というルールもありますが、テスト済みのメソッドで発生させることができる複数の例外を持つことができます。これはオプションである可能性があります。ゼロ、一つ以上の例外を発生させることができあなたの試験方法(例では、1つだけ、それを簡単にするために)、あなたは、コールがそうは例外は発生しませんしなければならないOKであった場合をテストしたい:

ユースケースはこれですcatchブロックに入ると、Assert.fail()が呼び出されます。例外を発生させる必要がある場合はテストケースが必要なので、catchブロックをコールします。Assert.assertTrue(true);言うまでもなく、「これは私が欲しいものです」そして、テストから、あなたが望むように実際に動作する場合、テストが失敗したときとテストを実行するときの1つのテスト方法で見ることができます。
質問です:この良いか悪い習慣のですか?どうして?
Assert.assertTrue(true)を使用しています。 Assert.fail()をアサートします。 JUnitテストの良い練習ですか?

public void fooMethod(boolean paramenter) { 
    if(false) { 
    throw new Exception(); 
    } 
} 

@Test 
public void testFooMethod() { 

    try { 
    myTestedClassMock.fooMethod(true); //should not raise exception 
    } catch(Exception e) { 
    Assert.fail(); 
    } 

    try { 
    myTestedClassMock.fooMethod(false); //should raise exception 
    } catch (Exception e) { 
    Assert.assertTrue(true); 
    } 

} 
+0

これはプログラマーズ・セーズのほうが良いかもしれませんが、私は真実を主張する点を見ることはできません。「期待されている」というコメントを書くことができます。 – stripybadger

+1

私は個人的には悪い習慣と考えています。あなたのユースケースでは、2つのテストメソッドを作成し、適切に名前を付けることができます。 2つの例外がある場合は、3つのテスト方法があると思います。そのようにすれば、より多くのテストメソッドを記述する必要がありますが、テストコードを大幅に簡素化することができます。また、メソッド名を使用して意図をよりうまく伝えることもできます。 – Michal

+0

'ExpectedException'クラスの使い方を学んでください。これは、あなたが記述したテクニックと、答えの1つに与えられたアノテーションベースのテクニックの両方に取って代わるものです。 –

答えて

2

assertTrueは異なる目的のために設計されているので、いつでもAssert.assertTrue(true)を残すことができます。複数のブール項目を含む一般的な条件をチェックすることがあります。定数trueをアサート

Assert.assertTrue(t == null ||| minSize < 0 || t.size() > minSize); 

は常に跡形もなく成功したので、あなたは完全にあなたのコードからこの行を削除することができます。予想される例外はがスローされていないときの状況をキャッチすることはすぐに予想される例外がスローされていないことを示すメッセージと、例外をスローしなければならないテストコードの行の後Assert.fail();を置くことによって行われます。

テストされた1つのメソッドに対して膨大なテストメソッドが必要ない場合は、これがオプションになる可能性があります。

典型的には、「膨大な数の試験方法は、」より良いオプションがあります。別の方法として、あなたではなく、個々の例外をキャッチするよりも、あなたのテストにExceptionまたはRuntimeExceptionをキャッチすることができます。これはプロダクションコードでは疑わしい習慣ですが、例外がスローされないようにする必要がある場合は、テストコードでは問題ありません。

しかし、Assert.fail();を持つことは珍しくショートカットではない、それはあまりにも、通常は許容されます。障害の原因を説明するメッセージを追加することをお勧めします。その結果、コードを管理しているユーザーは、何が起きているのかをテストで確認する必要がありません。例外をキャッチすると、そのメッセージはテストの失敗メッセージの候補になります。

+0

そして、あなたがMVCアプリケーションを持っていて、コントローラから呼び出されるメソッドを持つアプリケーションロジックclasessのテストをしているなら、それはもっと良いオプションです。そして、このテストされたclasessは3-4方法を持つことができますが、20-40もケースに依存します。したがって、テストされたメソッドごとに複数のテストメソッドがある場合、それは本当に面倒なことがあります。ありがとう – user1097772

+0

私は言っている:1つのクラスの20から40のメソッドを持つことは、すでにそれにある "悪臭"を持っています。 – GhostCat

+0

私は 'Assert.fail()'を引数なしで個人的に呼び出すことはしません。特に、メッセージとして使用する有益な例外がある場合。 – VGR

2

しかしあなたがそれを行うようにしないfail()使用することをお勧めします。これは、例外が発生した場合にテストを失敗させたいからです。これは、この例外をキャッチすることなく行うことができます。表示されている場合、テストは失敗します。代わりにassertTrue(true)を使用しての第2のケースで

は、あなたのメソッド呼び出しの後fail()を追加します。

myTestedClassMock.fooMethod(true); //should not raise exception 

try { 
    myTestedClassMock.fooMethod(false); //should raise exception 
    Assert.fail("Exception expected!"); 
} catch (Exception e) { 
    // exception handling 
} 

これはあなたの意図がより明確になり、あなたは例外がスローされない場合、テストが失敗したことがわかります。

+0

ありがとうございますが、最初のケースではtry-catchブロックでもメソッドを持たなければなりません。そうでなければ、コンパイラは赤ちゃんのように泣きます。fooMethodの定義を見て、そのボディにスローします。メソッド名の後にキャッチまたはスローする – user1097772

+0

必須ではありません。テストメソッドの定義に 'throws'宣言を追加できます。テストの有用性は何も変わりません。これは私の選択肢です。 – GHajba

+0

ええそれからOK =) – user1097772

1

第2のケースがありますか? 私はむしろ、次のチェックだろう。

try { 
    myTestedClassMock.fooMethod(false); 
    Assert.fail("should raise exception"); 
    } catch (Exception e) { 
    //Check if this is the exception you expected 
    } 

例外がスローされます場合は、最初のケースについては、それはとにかくテストを失敗する何を、そうAssert.fail()try-catchブロック

1

一部をする必要はありませんあなたのソースコードに関する良い習慣。

最初:各テストメソッド内に1つのアサートしかありません。だから、その方法が失敗すると、あなたはすぐにどこを見るかを知っています。また、あなたの問題に役立ちます

@Test 
public void testFooMethodThatShouldNotThrow() throws WhatEverException { 
    bar.foo(true) 

のfoo()は、上記のコードでスローのであれば、ユニットテストは失敗します。スロー句を追加しても問題ありません。

例外がスローされると予想されるとき。

@Test(expected=WhateverException.class) 
public void testFooMethodThatShouldThrow() { 
    bar.foo(false); 
} 

スローされた例外の特定のプロパティをチェックする場合は、次のようにします。あなたはそうするでしょう。

@Test 
public void bla { 
    try { 
    bar.foo(); 
    fail("should have thrown"); 
    catch (WhateverException e) { 
    assertThat(e.getMessage(), is("bla blub flubber")); 
    } 

たとえば、

最後に、正確に1つのアサートが必要です。assertThat。他のすべてについては忘れてください。それを使うことを学ぶ。

関連する問題