Specs2とMockitoを使用してScalaコードをテストドライブしようとしています。私は3つすべてに比較的慣れておらず、モックされたメソッドがnullを返すのに苦労しています。
以下では(いくつかの名前の変更で転写されています)
"My Component's process(File)" should {
"pass file to Parser" in new modules {
val file = mock[File]
myComponent.process(file)
there was one(mockParser).parse(file)
}
"pass parse result to Translator" in new modules {
val file = mock[File]
val myType1 = mock[MyType1]
mockParser.parse(file) returns (Some(myType1))
myComponent.process(file)
there was one(mockTranslator).translate(myType1)
}
}
「ファイルをパーサーに渡す」は、SUTにトランスレーター呼び出しを追加するまで機能しますが、mockParser.parse
メソッドがnullを返したために終了します。これは、トランスレーターコードでは取得できません。
同様に、「解析結果を翻訳者に渡す」は、翻訳結果をSUTで使用しようとするまで渡されます。
これらの両方のメソッドの実際のコードがnullを返すことはありませんが、期待値が使用可能な結果を返すようにMockitoに指示する方法がわかりません。
もちろん、SUTにnullチェックを入れることでこれを回避することはできますが、nullを返さないようにし、代わりに、、およびを使用するので、むしろ避けたいとOption
思いNone
ますSome
。
良いScala/Specs2 / Mockitoチュートリアルへのポインターは、次のような行を変更する方法の簡単な例と同様に素晴らしいでしょう。
there was one(mockParser).parse(file)
nullを処理しない場合に、SUTでの継続的な実行を可能にするものを返すようにします。
これを理解しようと急いで、私はその行をに変更しようとしました
there was one(mockParser).parse(file) returns myResult
私が返したいタイプのmyResultの値を使用します。MatchResult
それは私のリターンタイプではなくそこを見つけることを期待しているので、それは私にコンパイルエラーを与えました。
重要な場合は、Scala2.9.0を使用しています。