2014-11-20 2 views
1

다양한 콘크리트 파생물과 함께 특성 정의를 사용하고 객체에 종속성을 주입하고 단위 테스트를 수행 할 때 시스템의 일부를 조롱합니다. 문제는 유형의 조롱 된 버전이 암시 적 선언으로 사용될 때 소비 객체의 스칼라와 일치하지 않는다는 것입니다.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 패턴이 있습니까?

답변

2
이 코드가 성공적으로 컴파일하고 실행

스칼라 : 2.10.4

scalaTest : 2.1.0-RC2

scalaMock : 3.1.RC1

import org.scalamock.scalatest.MockFactory 
import org.scalatest.{FunSuite, Matchers} 

import scala.util.{Failure, Try} 

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] 
} 

class DbProvider extends DataProviderComponent { 
    override def find[T](id: Int): Try[T] = { 
    ??? 
    } 

    override def update[T](data: T): Try[T] = { 
    ??? 
    } 
} 

class UserRepository(implicit provider: DataProviderComponent) { 
    def userEnabled(id: Int): Boolean = { 
    val user = provider.find[User](id) 
    user.isSuccess && user.get.enabled 
    } 
} 

class UserRepositoryTest extends FunSuite with Matchers with MockFactory { 
    test("invalid data request should return false") { 
    implicit val mockProvider: DataProviderComponent = mock[DataProviderComponent] 
    (mockProvider.find[User] _).expects(13).returns(Failure[User](new Exception("Failed!"))) 

    val repo = new UserRepository() 
    repo.userEnabled(13) should be(false) 
    } 
} 
관련 문제