2011-08-13 2 views
1

예를 들어 간단한 추출기 Planex을 사용하면 .plan 파일 문자열을 분리하여 함께 다시 넣습니다. 나는 그것의 행동을 꽤 철저하게 정의하는 몇 가지 단위 테스트를 가지고있다. 내가 이것을 사용하는 Actor케이스 클래스와 추출기를 스칼라로 조롱하거나 스텁 할 수 있습니까?

object Planex { 
    def apply(metadata: String, plan: String) = { 
    String.format("%1$sPlan:\n%2$s", metadata, plan) 
    } 
    def unapply(str: String) = { 
    val ixPlanLabel = str indexOf "Plan:" 
    when(ixPlanLabel>=0) { 
     (str take ixPlanLabel, (str drop (ixPlanLabel+5)).trim) 
    } 
    } 
} 

: 여기 추출기입니다. PlanRepo 내 테스트에서

class PlanRepo(env: { 
    val jsonFormats: Formats 
    val load:() => String 
    val planTarget: String => Unit 
}) extends Actor { 
    implicit val jsonFormats = env.jsonFormats 
    def receive = { 
    case (metaData: String, plan: Plan) => { 
     val s = Planex(metaData,write(plan)) 
     env.planTarget(s) 
    } 
    case r: PlanRequest => { 
     val Planex(metaData, planStr) = env.load() 
     self.channel ! (metaData, read[Plan](planStr)) 
    } 
    } 
} 

, 나는 Planex를 제외하고 모든 종속성에 통과 할 수 있어요. 이를 위해, 나는 아직도 콘크리트 추출기 객체를 사용하고있다. 따라서 리포 테스트는 실제로 별도로 테스트 한 Planex의 동작을 테스트하는 것입니다. 이 문제를 해결할 방법이 있습니까?

이 문서의 json 부분의 계층 구조를 정의하는 중첩 된 사례 클래스 집합과 비슷한 문제가 있습니다. 서로 분리하는 데 문제가 있습니다.

답변

2

특성에서 추출기를 정의한 다음 Planex을 직접 구현하는 대신 특성을 확장하십시오.

원하는 경우 특성에 인터페이스를 정의하고 해당 특성을 확장하는 개체에 인터페이스를 구현하십시오.

trait PlanexAPI { 
    def apply(metadata: String, plan: String): String 
    def unapply(str: String): Option[String] 
    } 
} 

object Planex extends PlanexAPI { 
    def apply(metadata: String, plan: String) = { 
    String.format("%1$sPlan:\n%2$s", metadata, plan) 
    } 
    def unapply(str: String) = { 
    val ixPlanLabel = str indexOf "Plan:" 
    when(ixPlanLabel>=0) { 
     (str take ixPlanLabel, (str drop (ixPlanLabel+5)).trim) 
    } 
    } 
} 
+0

물론입니다. 왜 내가 이것을 생각하지 않았는지 모르겠다. stubbing 중첩 된 사례 클래스에 내 혼란이 남아 있지만, 내가 별도로 그것에 대해 물어볼 것입니다. – traffichazard

관련 문제