나는 이렇게 상당히 자주 내 코드에서 (내 DI 프레임 워크로 Guice를 사용하는) 것을 발견 :종속성 주입 및 관찰자 패턴
public class SomeObserver implements IObserver {
@Inject
SomeObserver(IObservable observable) {
observable.subscribe(this);
}
// Snip
}
테스트, 지금 요구하고하면이 최근 나에게 발생
최소한 모의 프로그램을 내 프로그램에 전달해야합니다. 이는 반드시 최악의 것은 아니지만 최소한 IObservable
인터페이스에 종속성을 바인딩하는 것에 달려 있습니다. 또 다른 옵션은, 생산,이 작업을 수행하는 것입니다 :
public class SomeModule extends AbstractModule {
// snip
@Provides
protected SomeObserver provideSomeObserver(IObservable observable) {
SomeObserver newObject = new SomeObserver();
newObject.subscribe(observable);
}
}
그런 다음 테스트에서, 나는 심지어
Observable
에 대한 참조가 필요가 없습니다. 그러나 생성자를 변경하고 싶다면 모듈도 변경해야합니다 (첫 번째 예제에서는 변경되지 않았습니다).
어느 것이 더 낫습니까? 아니면 더 나은 세 번째 옵션이 있습니까?
업데이트 : 약간의 유스 케이스에 대해 이야기하고 싶습니다.
데이터 소스가 Observable 인 데이터 처리 응용 프로그램을 생각해보십시오. 데이터 소스가 시스템의 다른 부분에 대해 알 필요가 없습니다 (Separation of Concerns). 데이터는 독립적 인 작업을 수행하는 적어도 세 명의 옵저버로 필터링됩니다. 테스트, 문제 분리 등의 이유로 데이터 소스를 스왑 가능 상태로 유지하려는 경우 데이터 소스가 Subscribable<Observer>
인터페이스로 정의한 내용을 구현하기 만하면 .subscribe(this)
을 호출하면됩니다.
그런 다음 종속성 주입 및 모듈을 사용하여 배선이 정확히 어떻게되는지를 결정합니다. 이 솔루션을 사용하면 주석을 사용하여 주사를 명확히하기 위해 내가 선택한 경우 decorate 관측 가능을 허용합니다.
필자는 본질적으로 원래 생각했던 배선을 관리하기 위해 종속성 주입을 사용하고 있습니다. ObservationManager
을 만들면 약간의 이득을 얻으려면 boilerplate이 많이 보입니다. 그러나 다시, 나는 뭔가를 놓칠지도 모른다.
이벤트 버스는 어떻습니까? – condit
@condit 같은 문제가 발생했다면 이벤트 버스를 조롱하거나 적어도 그것에 대한 참조를 만들어야합니다. 테스트 케이스에서 수동으로 메시지를 전달하는 경우에는 적합하지 않습니다. – durron597
테스트에서 이벤트 버스의 실제 인스턴스를 계속 사용할 수 있습니다. 구아바의'EventBus'를 사용하면 테스트 당 새 인스턴스 (또는 테스트 스위트)를 인스턴스화하고'EventBus '를 사용하는 것만 큼 간단합니다.post'를 생성자 (또는 두 번째 예제의 제공자)에 전달하는 대신에 사용합니다. – moofins