2017-12-12 10 views
1

scalatestとmockitoでBDDアプローチを使用しようとすると問題が発生しました。 コードの重複を減らすために、各必要なwhen()ルールをそれぞれの記述ブロックの中に入れました。しかし、私は、describe()ブロックの実行方法を注文することに驚いていました。Scala FunSpecはdesribe()の初期化と実行の順序をテストします

class SomeTest extends FunSpec with BeforeAndAfterAll with MockitoSugar { 

    private val catalogClient = mock[CatalogServiceClient] 

    override def beforeAll { 
     when(catalogClient.getFrame(any)).thenReturn(Frame()) 
    } 

    describe("MyTest1") { 
    println("Inside MyTest1") 

    when(catalogClient.getConnection(any)) 
     .thenReturn(Conn(ID_FOR_TEST_1)) 

    it("should perform action with data ID_FOR_TEST_1") { 
     println("Inside it 1") 
    } 

    it("should perform another action with data ID_FOR_TEST_1") { 
     /// 
    } 

    } 

    describe("MyTest2") { 
    println("Inside MyTest2") 

    when(catalogClient.getConnection(any)) 
     .thenReturn(Conn(ID_FOR_TEST_2)) 

    it("should perform logic with data ID_FOR_TEST_2") { 
     println("Inside it 2") 
    } 

    it("should perform another logic with data ID_FOR_TEST_2") { 
     /// 
    } 
    } 
} 

これは印刷:

"Inside MyTest1" 
"Inside MyTest2" 
"Inside it 1" 
"Inside it 2" 

を私は

"Inside MyTest1" 
"Inside it 1" 
"Inside MyTest2" 
"Inside it 2" 

第テストを期待しながら、モックデータが第2記述()ブロックに置き換えるために失敗しました。

まず最初にすべての記述ブロックを通過し、その後にテストを実行します。

いくつかの調査の末、path.FunSpecクラスで各記述ブロックの順序を保持していましたが、BeforeAndAfterのような使用特性は、runTest()メソッドを最終としてオーバーライドしています。

私は、このようなテストをコードの重複を最小限に抑えて整理するための良い習慣を知りたいと思います。私の特別なケースについてのいくつかの勧告。

答えて

1

デフォルトでは、scalatestはテストを並列実行し、テスト時間を短縮します。

この問題は、あなたが持っている別の問題を指摘し、幸いにも遭遇しました。あなたのテストは分離されていません。

問題を解決するには、それぞれのテストでモックされたオブジェクトの独自のバージョンを作成させます。コードの重複を減らしたい場合、scalatestにはすべてのテストの前にコードを実行できるフックがあります。

+0

例を更新しました。だから今私は1つの共通変数catalogClient 模擬、およびすべてのテストのbeforeAll()の共通の模擬ルールがあります。 >問題を解決するには、それぞれのテストで模擬オブジェクトの独自のバージョンを作成させます。 それぞれのwhen()定義をそれぞれの()テストに入れなければならないのですか?だから、そのケースコードの重複はまだ存在する。 – oleffir

+0

いいえ、 'mock'の呼び出しは各テストで発生する必要があります。もちろん、関数を抽出することはできますが、今はクラス全体で1つのインスタンスしか持っていません。 – Kraylog

関連する問題