junitモック化の使い方

単体テストではどこでもテストが出来る形でのテストとするため、モック(Mockito)を利用する

モック化パターン

モック対象種類

モックパターン

引数として渡すオブジェクト

通常モックパターン

テスト対象でnewしているオブジェクト

コンストラクタモックパターン

staticなオブジェクトのモック

staticオブジェクトモックパターン

通常モックパターン

  1. モック化方法
    アノテーション(@Mock)を付け、モック化する。
    Mockito.mock(モック対象クラス)
  2. モックの動き指定
    戻り値なしの場合:Mockito.doNothing().when(mock).logging(any(), anyString());
    Exceptionの場合:doThrowを利用する

    Mockito.doThrow(new ProvisionedThroughputExceededException(description)).when(client).putRecord(any());

     

  3. 戻り値ありの場合:Mockito.when(config.getRegion()).thenReturn(“ap-northeast-1”)
    Exception発生の場合:thenThrowを利用する

    ※Exception発生時、モック対象が発生し得ない例外は設定できない

コンストラクタモックパターン

  1. モック化方法
    モック用変数の定義

    VinHashRepositoryImpl mockVinHashGatewayImpl
    MockedConstruction<VinHashRepositoryImpl mockedVinHashGatewayImpl;
    

    モックの定義
    各テストケースにて必要となる場合、テスト実行前に実行される@BeforeEachのメソッド内でモックの定義を行う。テスト実行後にcloseする必要があるため、テスト実行後に実行される@AfterEachのメソッド内でモックのCloseを指定する

    @BeforeEach
    public void before() {
    // DtcDataGatewayImpl
    mockedVinHashGatewayImpl =
    Mockito.mockConstruction(VinHashRepositoryImpl.class, (mock, context) -> {
    mockVinHashGatewayImpl = mock;
    Mockito.doNothing().when(mockVinHashGatewayImpl).save(any()); Mockito.when(mockVinHashGatewayImpl.isRegistered(any())).thenReturn(false);
    });
    }
    @AfterEach
    public void after() {
    mockedVinHashGatewayImpl.close();
    }
    
  2. モックの動き指定
    通常モックパターンと同じ。ただし、モック用変数定義の中で全ての動きを指定する必要あり。

staticモックパターン

  1. モック化方法
    mockStaticを利用する

    Mockito.mockStatic(LocalDateTime.class);
  2. モックの動き指定
    通常モックパターンと同じ。
    LocalDateTimeをモック化する場合の例:

    // LocalDateTimeモック定義
    LocalDateTime datetime = LocalDateTime.of(1977, 12, 24, 12, 34, 56, tel:789000000);
    mockedLocalDateTime = Mockito.mockStatic(LocalDateTime.class); mockedLocalDateTime.when(LocalDateTime::now).thenReturn(datetime);
    

Smallitのサービス