モックインスタンスを guice でインジェクションさせるパターンは、ネット検索すれば、
たくさん見つかる。
しかし、Injector の生成メソッド Guice#createInjector をモックしてテスト用の Injector を生成させるパターンは
見たことがない。
MockedStatic で、Guice#createInjector のメソッドの引数のマッチング指定は、
createInjectorメソッドが、可変長引数の Module であることとメソッド形式 ポリモーフィズムのせいで、
難しくなる。
スタティックメソッドのモックなので、mockito-inline が必要
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.4.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.4.0</version> <scope>test</scope> </dependency>
Guice#createInjector モックでテスト用の Injector を返す例
モックの指定前に、テスト用の Injector を作っておく( try文の前で作っておかなくてはならない)
必要な import
import org.mockito.ArgumentMatchers; import org.mockito.MockedStatic; import org.mockito.Mockito; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.AbstractModule;
@Before で Injector 生成しておくあるいは、モック定義の前に作成しておく
ArgumentMatchers.any() の指定の仕方が重要で、
com.google.inject.Module[] を型として指定する
try(){ } の中だけが有効である
private Injector injector; @Before public void before() { injector = Guice.createInjector(new AbstractModule() { @Override protected void configure(){ // TODO テスト用のバインド定義 } }); } @Test public void test() { try(MockedStatic<Guice> mock = Mockito.mockStatic(Guice.class)) { mock.when(()->Guice.createInjector(ArgumentMatchers.<com.google.inject.Module[]>any())) .thenReturn(injector); // TODO テスト対象を実行 } }