- サービスを提供するインターフェース
public interface IService { int service(int a, int b); }
- サービスの実装
public class ServiceImpl implements IService { public int service(int a, int b) { return a + b; } }
- サービスを利用するクライアント
import com.google.inject.Inject; public class Client { @Inject IService service; public int executeService(int a, int b) { return service.service(a, b); } }
import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; public class ClientTest { private Injector injector; @Before public void setUp() { injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(IService.class).to(ServiceImpl.class); } }); } @Test public void test01() { setUp(); Client client = injector.getInstance(Client.class); assertEquals(3, client.executeService(1, 2)); } @Test(expected = NullPointerException.class) public void test02() { Client client = new Client(); assertEquals(3, client.executeService(1, 2)); } }test01は当然問題無く実行できるし、test02はinjectorを通さずにnewするからinjectが行われずにぬるぽする。こんなカンジで、自前でnewしたらinjectできなくて当然!とか思ってたけど、injectMembers()というメソッドがある事を知った。これを使えば、自前でnewしても(もしくは自分で制御できないタイミングで外部でnewされてしまう)injectできるの?と試してみた。
@Test public void test03() { Client client = new Client(); injector.injectMembers(client); assertEquals(3, client.executeService(1, 2)); }あっさり想定通りの動作をしてくれた。便利やなー。
ちなみに、S2ContainerにもinjectDependency()ってのがあるようだ。
0 件のコメント:
コメントを投稿