2016-07-18 16 views
6

google-truthを使用して特定のメッセージの例外がスローされているかどうかをテストしたいだけです。google-truthを使用して予期しない例外がスローされていることをテストするにはどうすればよいですか?

junitを使用して@Test(expected=を使用するのはかなり簡単ですが、私は真実でそれを行う方法を理解することができません。 ThrowableSubjectのサンプルはありません。

この種のテストでは、JUnitをプレーンにする必要がありますか?

答えて

9

現在のところ、真実の著者は、明確で明示的であるため、try/fail/catchパターンを使用することをおすすめします。 @Rule ExpectedException@Test(exception=...)はJUnitの中に存在するが

try { 
    doSomethingThatThrows(); 
    fail("method should throw"); 
} catch (SpecificException e) { 
    // ensure that e was thrown from the right code-path 
    // especially important if it's something as frequent 
    // as an IllegalArgumentException, etc. 
    assertThat(e).hasMessage("blah blah blah"); 
} 

、これらは、彼らはあなたが合格しかしこれを失敗するテストを書くことができ、いくつかの微妙な(そしてあまり微妙)な方法を持っている限り、真実チームによって推奨されていません。

これはtry/fail/catchでも当てはまりますが、内部的にはerror-proneを使用してこれを緩和しています。このパターンでは、このパターンでfail()などが省略されないように静的なコンパイル時チェックが行われます。エラーを起こしやすい、または別の静的解析チェックを使用してこれらをキャッチすることを強くお勧めします。悲しいことに、ルールベースおよびアノテーションベースのメソッドは、このtry/catchブロックと同じように静的解析に容易に適用できません。

真実の著者はそれが

ビット総だろうが、これは、事前java8使用することができ

assertThat(() -> doThrowingMethod()) 
    .named("doThrowingMethod()") 
    .throwsException(SomeException.class) 
    .withMessageContaining("Foo bar") 
    .withCause(OtherThrowable.class); 

ようになっているはずれ、Java8優しい機能に取り組んでいる、と述べた


ThrowingRunnable throwing = new ThrowingRunnable() { 
    @Override void run() throws Throwable { 
    doThrowingMethod(); 
    } 
}; 
assertThat(throwing) 
    .named("doThrowingMethod()") 
    .throwsException(SomeException.class) 
    .withMessageContaining("Foo bar") 
    .withCause(OtherThrowable.class); 

注:投機的APIはまったく変更されることがあります。この回答は、地形が上陸すると更新されます。欲しい方はこちら更新は、私たちはクリスチャンが記述パターンから離れて移動してきたように、それはIssue #219

0

あなたが何か必要な意味:

 try { 

      //do here something that should throw exception 
      //... 
      assertTrue("expected exception when .......", false); 

     } catch (Exception ex) {} 

を??

+2

まあオプションだが、私見非常に醜いですつまり、私はもっと流暢のようなもので考えていた前JUnitの4に行うために使用したものと類似: '' 'assertThat(」期待通り ")。willThrow(" whatever.class ")' '' – Imanol

+0

私たちはJava8のためのより堅牢なものを探しています。 assertThat(foo).whenRunning(() - > runMethod()).throws(Throwable.class).withMessage( "blah"); ' –

+0

Er:' assertThat(() - > runMethod())throws (Throwable.class).withMessage( "blah"); ' –

2

現在、Exceptiongoogle-truthであることを確認する組み込みの方法はありません。あなたは、次のいずれかの操作を実行することができます:あなたは

  • 書き込みが運動/動作を囲んで「醜い」の方法をテストしたように、

    次の例のようにyour own流暢なアサーション、similar to what AssertJ already hasを作りますそれはsupports Java 1.6なのでimilarな機能です。

    import com.google.common.truth.FailureStrategy; 
    import com.google.common.truth.Subject; 
    import com.google.common.truth.SubjectFactory; 
    import org.junit.Test; 
    
    import java.util.concurrent.Callable; 
    
    import static com.google.common.truth.Truth.assertAbout; 
    
    public class MathTest { 
        @Test 
        public void addExact_throws_ArithmeticException_upon_overflow() { 
         assertAbout(callable("addExact")) 
          .that(() -> Math.addExact(Integer.MAX_VALUE, 1)) 
          .willThrow(ArithmeticException.class); 
        } 
    
        static <T> SubjectFactory<CallableSubject<T>, Callable<T>> callable(String displaySubject) { 
         return new SubjectFactory<CallableSubject<T>, Callable<T>>() { 
          @Override public CallableSubject<T> getSubject(FailureStrategy fs, Callable<T> that) { 
           return new CallableSubject<>(fs, that, displaySubject); 
          } 
         }; 
        } 
    
        static class CallableSubject<T> extends Subject<CallableSubject<T>, Callable<T>> { 
         private final String displaySubject; 
    
         CallableSubject(FailureStrategy failureStrategy, Callable<T> callable, String displaySubject) { 
          super(failureStrategy, callable); 
          this.displaySubject = displaySubject; 
         } 
    
         @Override protected String getDisplaySubject() { 
          return displaySubject; 
         } 
    
         void willThrow(Class<?> clazz) { 
          try { 
           getSubject().call(); 
           fail("throws a", clazz.getName()); 
          } catch (Exception e) { 
           if (!clazz.isInstance(e)) { 
            failWithBadResults("throws a", clazz.getName(), "throws a", e.getClass().getName()); 
           } 
          } 
         } 
        } 
    } 
    
  • +0

    私たちは、Java8のためのより堅牢なものを探しています。 'assertThat() - > runMethod())の行に沿ったもの。throws(Throwable.class).withMessage(" blah ");' –

    2

    を見ることができます追跡するため、およびIssue #219はJUnitののexpectThrows()の賛成で閉じられていた(4.13に来て、同様の方法がすでに存在していますin TestNG's Assert)。

    expectThrows()と並行して、真実を使用してassertions about the thrown exceptionを作ることができます。だから、クリスチャンの例では、今のようになります。

    SpecificException expected = expectThrows(
        SpecificException.class,() -> doSomethingThatThrows()); 
    assertThat(expected).hasMessageThat().contains("blah blah blah"); 
    
    関連する問題