2017-01-26 10 views
1

私は特定の値を提供するために、モック設定を作成し、Scalaでテストを設定します。私はScalaTest 3.0.1、3.4.2 ScalaMock、 および型保証1.3.1を使用しています。目標は、テストを実行する前にconfigの値を疑似化することです。 http://www.scalatest.org/user_guide/testing_with_mock_objectshttp://scalamock.org/user-guide/features/のドキュメントは カップルのオプションを提供するように見えます。まず、ここではいくつかのターゲット・コードは次のとおりです。反復メソッド呼び出しのためにScalaMockを一度セットアップするには?

import com.typesafe.config.Config 
class Sample(config: Config) { 
    private val aValue = config.getDouble("aValue") 
} 

1時間まで、すべてを設定するか、各テストの前にすべてのものを設定することが可能なはずであるように思え。この試みは失敗します。

class SampleSpec extends FlatSpec with MockFactory with BeforeAndAfterAll { 

    private val mockConfig = mock[Config] 

    override def beforeAll { 
    (mockConfig.getDouble _).expects("aValue").returning(1.0).anyNumberOfTimes() 
    } 

    "testOne" should "return 1" in { 
    new Sample(mockConfig) 
    } 

    "testTwo" should "return 1" in { 
    new Sample(mockConfig) 
    } 

} 

最初のテストが成功したが、治具における第二のテストは失敗し、このエラーが生成されます

Unexpected call: <mock-1> Config.getDouble(aValue) 

Expected: 
inAnyOrder { 

} 

Actual: 
    <mock-1> Config.getDouble(aValue) 
ScalaTestFailureLocation: scala.Option at (Option.scala:120) 
org.scalatest.exceptions.TestFailedException: Unexpected call: <mock-1> Config.getDouble(aValue) 

Expected: 
inAnyOrder { 

} 

はここで別のアプローチです:

class SampleSpec extends FlatSpec with MockFactory with BeforeAndAfter { 

    private val mockConfig = mock[Config] 

    before { 
    (mockConfig.getDouble _).expects("aValue").returning(1.0) 
    } 

    "testOne" should "return 1" in { 
    new Sample(mockConfig) 
    } 

    "testTwo" should "return 1" in { 
    new Sample(mockConfig) 
    } 

} 

それが生成しますこの例外:

An exception or error caused a run to abort: assertion failed: Null expectation context - missing withExpectations? 
java.lang.AssertionError: assertion failed: Null expectation context - missing withExpectations? 

最初の試行はなぜ失敗するのですか?テストはgetDoubleは何度でも呼び出すことができるように指定し、まだanyNumberOfTimes()が使用されていなかったかのように、第2 テストは失敗します。メソッドを一度嘲笑して、 が繰り返し呼び出されるように、これをどのようにコード化すればよいですか? 2回目の試行はなぜ失敗するのですか?モックをリセットして再利用できる方法はありますか?

答えて

1

私はまた、(形質を使用して)わずかに異なるスタイルで、このためのマニュアルページを指摘したいと思います。たとえば

http://scalamock.org/user-guide/sharing-scalatest/#fixture-contexts

:面白い

class SampleSpec extends FlatSpec with OneInstancePerTest with MockFactory { 

    private val mockConfig = mock[Config] 

    (mockConfig.getDouble _).expects("aValue").returning(1.0).anyNumberOfTimes 

    "testOne" should "return 1" in { 
    new Sample(mockConfig) 
    } 

    "testTwo" should "return 1" in { 
    new Sample(mockConfig) 
    } 

} 
+0

私は最初の手法(OneInstancePerTest)を適用しました。私は他の場所でこれについてドキュメントを見てきましたが、この説明はより明確です。例を提供するための編集... –

1

手動で、毎回モックを再作成は、私はそれが仕事を得ることができる唯一の方法である:あなたのテストは全く変化していないので

class SampleSpec extends FlatSpec with MockFactory { 

    private def mockConfig = { 
    val mocked = mock[Config] 
    (mocked.getDouble _).expects("aValue").returning(1.0).anyNumberOfTimes() 
    mocked 
    } 

    "testOne" should "return 1" in { 
    new Sample(mockConfig) 
    } 

    "testTwo" should "return 1" in { 
    new Sample(mockConfig) 
    } 

} 

簡単です。ロジックを「グローバルローカル」変数から個々のテストのローカルスコープに移動するだけです。

+0

ああ、 。私は前のブロックでそれを再作成しようとしましたが、質問で私の試み2と同じエラーがありました。 –

+0

私はあなたの答えが好きです。セットアップの前後にコンテキストを追加するように編集しました。 –

関連する問題