2016-10-15 10 views
2

ScalaTestを使用して、失敗したTryの内容をチェックする最善の方法について知りたいと思います。私は、現時点ではやっていることは次のようになります。あなたが見ることができるようにFailure [T]に含まれる例外を確認するにはどうすればよいですか?

"Subject" should "throw proper exceptions.." in { 
    a[IllegalArgumentException] should be thrownBy { 
    val tryValue = // some method call.. 
    if (tryValue.isFailure) throw tryValue.failed.get 
    } 
} 

、私は例外のラップを解除して手動で投げます。同じことを達成するための慣用的な方法がありますか?

+0

最初に、好きなものに入る前に、 'if(tryValue.isFailure)throw tryValue.failed.get'を' tryValue.get'に置き換えることができます。 –

+0

@TzachZohar私はそれが意味論的に同じことだとは思わない。 'tryValue'が' Failure'ではなく 'Success'である場合、潜在的なテスト結果をより複雑にする別の例外が(' get'呼び出しのために)スローされます(はい、テストは失敗しますが)。または私は間違っていますか? – ceran

+1

tryValueが失敗ではなく成功した場合、例外はスローされず、 'java.lang.IllegalArgumentExceptionがスローされますが例外はスローされませんでした 'とエレガントに失敗します。これはまったく同じですあなたのコードを入手してください。 –

答えて

4

私は本当にFailure結果はちょうど別の結果であることを考えるとスロー例外は、ないものといいよ一致することができる:

"Subject" should "throw proper exceptions.." in { 
    val tryValue = // some method call... 
    tryValue shouldBe a[Failure[_]] 
    tryValue.failed.get shouldBe an[IllegalArgumentException] 
} 

T上の彼はアサーションを分けています:あなたは失敗が起こらなかった場合と間違った失敗が起こった場合の異なるテスト失敗を見るでしょう。

+0

これも私が念頭に置いていたことですが、テストフレームワークの例外メカニズム(ここでは 'thrownBy')を迂回するのが良い方法であるかどうかはわかりませんでした。しかし、私はそれが良いようだと思うので、ありがとう。 – ceran

1

希望、これは便利です

Try(1/0) match { 
      case Success(success) => 
      case Failure(error) => println(error.getClass.getName) 

     } 

結果:java.lang.ArithmeticException

関連する問題