2011-11-27 1 views
2

스칼라 컴패니언 객체가 객체 팩토리로 자주 제안됩니다. 이것들은 프로덕션 코드에서 잘 작동하는 것처럼 보이지만 테스트를 위해 모의 객체를 삽입하는 것은 어떨까요? 동반자 객체는 모의 객체에 대해 알지 못하므로 인스턴스화 할 수 없습니다.공장 특성을 확장하여 스칼라 컴패니언 객체를 팩토리로 사용. 더 나은 솔루션?

나는 같은 것을 할 싶습니다

class Foo {} 
object Foo { 
    def create():Foo = new Foo() 
} 

class FooCreator(factory:Foo) { 
    def this() = this(Foo) 
    ... 
    factory.create() 
    ... 
} 

class FooMock extends Foo {} 
object FooMock extends Foo { 
    def create():Foo = new FooMock() 
} 

// in a test 
val fooCreator = new FooCreator(FooMock) 

동반자 객체가 확장 될 수 없기 때문에이 작동하지 않습니다. 믹스 할 두 컴패니언 개체에 대한 팩토리 특성을 만들어야합니다.

trait FooFactory { 
    def create():Foo; 
} 

class Foo {} 
object Foo extends FooFactory { 
    def create():Foo = new Foo() 
} 

class FooCreator(factory:FooFactory) { 
    def this() = this(Foo) 
    ... 
    factory.create() 
    ... 
} 

class FooMock extends Foo {} 
object FooMock extends FooFactory { 
    def create():Foo = new FooMock() 
} 

// in a test 
val fooCreator = new FooCreator(FooMock) 

더 좋은 방법이 있나요? factory 특성을 생성하는 것은 잘못된 것이고, 그것은 companion 객체가 좋은 것으로 생각되기 때문입니다. (모의 가공물은 테스트 하위 시스템에만 알려져 있으므로, Foo 객체를 FooMock 인스턴스 (생산 코드의 공통 패턴)를 만들어서 문제를 해결할 수는 없습니다. 내 질문에 대한 답변에 설명 된대로

+0

제가 생각하기에, 당신이 필요로하는 것은 ** 의존성 주입 ** 프레임 워크/라이브러리/접근법입니다. – tenshi

답변

1

그 수 (다른 것들 사이) 모의 객체 생성 (컴파일러 호출). 이것은 정확하게 해결하려는 문제 중 하나입니다.

관련 문제