「Cake Pattern」モジュールの単体テストを目的として、Scalatest で Scalamock を使用する方法を見つけました。
最初は(これを含め)多くの問題がありましたが、以下に示す解決策は受け入れられると思います。ご不明な点がございましたら、お気軽にお問い合わせください。
これは私があなたの例を設計する方法です:
trait VetModule {
def vet: Vet
trait Vet {
def vaccinate(pet: Pet)
}
}
trait PetStoreModule {
self: VetModule =>
def sell(pet: Pet)
}
trait PetStoreModuleImpl extends PetStoreModule {
self: VetModule =>
def sell(pet: Pet) {
vet.vaccinate(pet)
// do some other stuff
}
}
テストは次のように定義されます。
class TestPetstore extends FlatSpec with ShouldMatchers with MockFactory {
trait PetstoreBehavior extends PetStoreModule with VetModule {
object MockWrapper {
var vet: Vet = null
}
def fixture = {
val v = mock[Vet]
MockWrapper.vet = v
v
}
def t1 {
val vet = fixture
val p = Pet("Fido")
(vet.vaccinate _).expects(p)
sell(p)
}
def vet: Vet = MockWrapper.vet
}
val somePetStoreImpl = new PetstoreBehavior with PetStoreModuleImpl
"The PetStore" should "vaccinate an animal before selling" in somePetStoreImpl.t1
}
val vet = fixture
このセットアップを使用すると、作成するすべてのテストで呼び出さなければならないという「欠点」があります。一方、テストの別の「実装」を簡単に作成できます。
val someOtherPetStoreImpl = new PetstoreBehavior with PetStoreModuleOtherImpl