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つの共通変数catalogClient 模擬、およびすべてのテストのbeforeAll()の共通の模擬ルールがあります。 >問題を解決するには、それぞれのテストで模擬オブジェクトの独自のバージョンを作成させます。 それぞれのwhen()定義をそれぞれの()テストに入れなければならないのですか?だから、そのケースコードの重複はまだ存在する。 – oleffir
いいえ、 'mock'の呼び出しは各テストで発生する必要があります。もちろん、関数を抽出することはできますが、今はクラス全体で1つのインスタンスしか持っていません。 – Kraylog