Guice Injector の mock

モックインスタンス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 テスト対象を実行
    }

}