다양한 콘크리트 파생물과 함께 특성 정의를 사용하고 객체에 종속성을 주입하고 단위 테스트를 수행 할 때 시스템의 일부를 조롱합니다. 문제는 유형의 조롱 된 버전이 암시 적 선언으로 사용될 때 소비 객체의 스칼라와 일치하지 않는다는 것입니다.scalamock을 사용하여 스칼라에서 암시 적으로 조롱 된 객체 사용
다음은 내 설정의 단순화 된 버전입니다. 방법이 있습니까 Test1 가짜를 사용하여 작동합니다. Test2은 잘 작동하지만 유지 관리가 어렵고 설정이 너무 많이 필요합니다.
모델 :
case class User (first: String, last: String, enabled: Boolean)
구성 요소 정의 : 콘크리트 구성 요소 구현의
trait DataProviderComponent {
def find[T](id: Int): Try[T]
def update[T](data: T): Try[T]
}
한 : 어딘가에 시스템의 구성 요소 IMPL의
class DbProvider extends DataProviderComponent {
override def find[T](id: Int): Try[T] = { ... }
override def update[T](data: T): Try[T] = { ... }
}
암시 적 사용 :
implicit val provider = new DbProvider()
class UserRepsitory(implicit provider: DataProviderComponent) {
def userEnabled(id: Int): Boolean = {
val user = provider.find[User](id)
user.isSuccess && user.get.enabled
}
}
Unit Test1, 저장소 테스트를 분리하기 위해 공급자를 조롱하려고했습니다.
class UserRepository$Test1 extends FunSuite with Matchers with MockFactory {
test("invalid data request should return false") {
implicit val mockProvider = mock[DataProviderComponent]
(mockProvider.find[User] _).expects(13).returns(Failure[User](new Exception("Failed!")))
val repo = new UserRepsitory()
repo.userEnabled(13) should be (false)
}
}
이 버전은 작업을 수행하지만 유지 관리가 어렵고, 더 많은 코드가 필요합니다 :
class UserRepository$Test2 extends FunSuite with Matchers with MockFactory {
test("invalid data request should return false") {
class FakeProvider extends DataProviderComponent {
override def find[T](id: Int): Try[T] = ???
override def update[T](data: T): Try[T] = Failure[T](new Exception("Failed!"))
}
implicit val provider = new FakeProvider()
val repo = new UserRepsitory()
repo.userEnabled(13) should be (false)
}
}
인가를이 DataProviderComponent을 기반으로하더라도이 저장소 클래스는 암시 적 일치하지 않는 작동하지 않습니다 거기 주입 된 형식으로 조롱 된 형식을 사용하는 방법 - 또는이 문제를 해결하는 데 사용해야하는 다른 scala-thonic 패턴이 있습니까?