- サービスを提供するインターフェース
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 件のコメント:
コメントを投稿