2022年02月13日に一度に終了するスプリングオーバーを選択します.販売格差パッケージオンライン.


テストメソッド


講師は私たちに実際の仕事でのテストスキルと経験を話してくれた.
  • myBatisは
  • をテストするのが非常に難しい.
  • 以降は、時間が経つにつれて、クエリーではなくJPAが行われ、Javaコードには多くのロジックが含まれます.
  • は、保守性を大幅に向上(クエリーによる実装が困難または不可能)する
  • である.
  • javaコードの論理は、テストクエリの論理よりも
  • 便利です.

    テストの基礎を作る


  • クラスまたはメソッドは、単一の責任原則(SRP)を遵守し、適切なサイズでなければなりません.
  • では、1つの方法で多くのテストを実行することなく、テストに集中できます.
  • これもテストを行う利点の一つである(テストを行う際に、キャラクタの確認に伴って自然に破断する)
  • .

  • 適切なパッケージによる分離
  • ユニットテストは万能ではありませんが、上記のSRPのように方法の役割を正確にテストするには、環境条件
  • を制御する必要があります.

  • 必ずうまく動くとは思わないで、コード量を丁寧にテスト&中断しないでください.
  • テストコードもコードレビュー時に適切なテストを行う必要があります

  • テストコードの改善に努める
  • テストコード
  • を再包装する必要がある
  • テストコードの技術も継続的な思考(集積テストなど)
  • が必要である.

    Junit、Mockito説明


    Junit


    純粋にJavaのUnitテストフレームワークです.
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    この中にはジェニート5もいます!

    一般的なテスト構造

        @Test
        public void testSomething(){
            String result ="hello"+"world!";
    
            assertEquals("hello world!",result);
        }
    org.junit.jupiter.api.Assertions.*
    JUnitで最も一般的な検証ツールの1つ
    assertEquals(推定値、実績値);この形で使います.
    @SpringBootTestプレゼンテーションを追加し、JunitにSpringに空のサービスとして簡単に登録できます.

    @SpringBootTest


    アプリケーションを直接解放するようなテストでは、基本的にすべての空きが解放され、実際の実行環境が作成され、テスト環境の構築に役立ちます.
    基本的には統合テストです.
    動作をすると、設定したアプリケーションが動作し、テストを実行します.

    結果画面



    テストコードの作成

    @SpringBootTest
    class DMarkerServiceTest {
    
        @Autowired
        private DMarkerService dMarkerService;
    
        @Test
        public void testSomething() {
            dMarkerService.createDeveloper(CreateDeveloper.Request.builder()
                    .developerLevel(DeveloperLevel.SENIOR)
                    .developerSkillType(DeveloperSkillType.FRONT_END)
                    .experienceYears(12)
                    .memberId("memberId")
                    .name("name")
                    .age(32)
                    .build());
            List<DeveloperDto> allEmployedDevelopers = dMarkerService.getAllEmployedDevelopers();
            System.out.println(allEmployedDevelopers);
        }
    }

    このようにすると、隔離性が悪く、データベースにデータがあるとテストができないなどの問題があります.
    ->解決策は隔離性を高める方法Mockingです.

    Mockito


    隔離性の向上
    @SpringBootTestプレゼンテーションを削除します.
    @ExtendWith(Mockito Extension.class)を追加します.

    Mockito Test


    @Autowiredの代わりに@InjectMocksを使用
    @InjectMocksは偽物をDMakerServiceに導入します.
    DmakerServiceには2つの依存項目があります.@Mockとして追加します.
     @Mock
        private DeveloperRepository developerRepository;
        @Mock
        private RetiredDeveloperRepository retiredDeveloperRepository;
    これにより、テストに2つのrepositoryが登録され、@InjectMockを使用してクラスを作成するときに自動的に2つのMockが追加されます.
           given(developerRepository.findByMemberId(anyString()))
                    .willReturn(Optional.of(Developer.builder()
                            .developerLevel(DeveloperLevel.SENIOR)
                            .developerSkillType(DeveloperSkillType.FRONT_END)
                            .experienceYears(12)
                            .statusCode(StatusCode.EMPLOYED)
                            .name("name")
                            .age(12)
                            .build()));
    findByMemberIdに任意の文字列を追加すると、次の応答をシミュレートできます.

    完全なコード

    @ExtendWith(MockitoExtension.class)
    class DMarkerServiceTest {
    
        @Mock
        private DeveloperRepository developerRepository;
        @Mock
        private RetiredDeveloperRepository retiredDeveloperRepository;
    
        @InjectMocks
        private DMarkerService dMarkerService;
    
        @Test
        public void testSomething() {
            given(developerRepository.findByMemberId(anyString()))
                    .willReturn(Optional.of(Developer.builder()
                            .developerLevel(SENIOR)
                            .developerSkillType(FRONT_END)
                            .experienceYears(12)
                            .statusCode(StatusCode.EMPLOYED)
                            .name("name")
                            .age(12)
                            .build()));
            DeveloperDetailDto developerDetail = dMarkerService.getDeveloperDetail("memberId");
            assertEquals(SENIOR,developerDetail.getDeveloperLevel());
            assertEquals(FRONT_END,developerDetail.getDeveloperSkillType());
            assertEquals(12,developerDetail.getExperienceYears());
        }
    }

    実行結果


    成功時



    失敗した場合