[Test] SpringBoot Test - Service (Mockito)


Unit Test ?


ユニットテストは、サービス・レベルのビジネス・ロジックのみを検証するため、レポートやコントローラの影響を受けない環境でテストする必要があります.

テストのFAST原則


F-Fast:テストを試してみるには、迷わずに早くしなければなりません.
I-Independent:オブジェクトの状態、メソッド、以前のテストステータス、および他のメソッドの結果に依存できません.
R-Repeatable:どの環境でも同じ結果を繰り返す必要があります.
S-Self-Validating:すべてのテストに合格または失敗の結果が必要です.
T-Timely:実際のコード生成前にテストを行う必要があります.実際のコードを実装した後にテストコードを作成すると、テストできないように実際のコードが設計される場合があります.

Mockito


Javaでユニットテスト用にモジュールを作成するフレームワーク

Mock


実際のオブジェクトの作成と使用にかかるコスト(時間、コストなど)が高いか、オブジェクト間の依存性が強く、実装が困難な場合に偽のオブジェクトを作成および使用します.
使用法:https://github.com/mockito/mockito/wiki/Mockito-features-in-Korean

サービステストの作成

@ExtendWith(MockitoExtension.class)
class SafetyInfoServiceTest {
    @InjectMocks
    private SafetyInfoServiceImpl safetyInfoService;

    @Mock
    private SafetyInfoRepository safetyInfoRepository;

    @Mock
    private UserRepository userRepository;

    @Mock
    private SafetyInfoQueryRepository safetyInfoQueryRepository;

    final String userEmail = "[email protected]";

    void setup(){
        User user = User.builder().build();
        given(userRepository.findByEmail(userEmail)).willReturn(Optional.of(user));
    }

    @Test
    void findAllSafetyInfo() {
        // given
        setup();
        List<FindSafetyInfoResDto> expected = new ArrayList<>();
        given(safetyInfoQueryRepository.findAllWithUserId(any())).willReturn(expected);

        // when
        List<FindSafetyInfoResDto> response = safetyInfoService.findAllSafetyInfo(userEmail);

        // then
        assertThat(response).isEqualTo(expected);
    }
}

@ExtendWith(MockitoExtension.class)


SpringContainerをロードしない(=Springに依存しない)必要なオブジェクトのみを実行する->非常に速い! 

@Mock, @InjectMocks


-@Mock:テストで「必須」のダミー
-@InjectMocks:依存性を注入する必要があるMockオブジェクト
@Mockとして宣言されたダミーオブジェクトに依存する@InjectMocksオブジェクトを作成します.

given(a(b)).willReturn(c)


メソッド実行時テストの状況の設定
-a:Mockingメソッド
-b:メソッドのパラメータ
-c:メソッド実行時に返される値の設定

when.thenReturn VS given.willReturn


いつ:Mockitoのインポート
指定:BDMockitoのインポート
違い:BDDメソッドをコードに導入すると、既存のMockitoは可読性を損なうため、この問題を解決する機能は同じですが、名前の異なるクラス!