現在、JSF Web アプリケーションの JUnit テストに Guice を使用しています。いくつかのクラスがあるとします:
class ServiceA
{
@Inject
ServiceB serviceB;
//do something using serviceB
...
}
interface ServiceB
{
//APIs in ServiceB
...
}
class ServiceBImpl implements ServiceB
{
@Inject
ServiceC serviceC;
//do something using serviceC
...
}
interface ServiceC
{
//APIs in ServiceC
...
}
class ServiceCImpl implements ServiceC
{
//do something
...
}
ここで、Guice を使用してServiceAのモジュールを作成します。私のモジュールは次のようになります
class ServiceAModule implements Module
{
@Override
public void configure(Binder binder) {
binder.bind(ServiceB.class).to(ServiceBImpl.class);
}
}
そして、私の JUnit テスト クラスでは、Guice を使用してインジェクションを作成します。これは次のようになります。
public ServiceATest
{
ServiceA serviceA;
@Before
public void before()
{
Injector injector = Guice.createInjector(new ServiceAModule());
serviceA = injector.getInstance(ServiceA.class);
}
//do the test
...
}
ここでの問題は、ServiceATest が「ServiceC」について何も知らないことであり、ServiceB に注入されません。
もちろん、ServiceC のインジェクションを ServiceB に導入する別のモジュールを作成することもできます。しかし、これは確かにコードの階層化を壊します。ServiceC が別の人によって開発され、私が ServiceC について何も知らない場合はどうなりますか? これは良い解決策ではありません。
Guice でこのような多層インジェクションを処理することは可能ですか?