1. 概要

Spring JdbcTemplate は、開発者がSQLクエリの記述と結果の抽出に集中できる強力なツールです。 バックエンドデータベースに接続し、SQLクエリを直接実行します。

したがって、統合テストを使用して、データベースからデータを適切にプルできることを確認できます。 また、関連する機能の正確さをチェックするための単体テストを作成することもできます。

このチュートリアルでは、JdbcTemplateコードを単体テストする方法を示します。

2. JdbcTemplateおよび実行中のクエリ

まず、 JdbcTemplate を使用するデータアクセスオブジェクト(DAO)クラスから始めましょう。

public class EmployeeDAO {
    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public int getCountOfEmployees() {
        return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class);
    }
}

DataSourceオブジェクトをEmployeeDAOクラスに依存性注入します。 次に、setterメソッドでJdbcTemplateオブジェクトを作成します。 また、サンプルメソッド getCountOfEmployees()。JdbcTemplateを使用します。

を使用する単体テストメソッドには2つの方法があります JdbcTemplate

テスト用のデータソースとしてH2データベースなどのインメモリデータベースを使用できます。 ただし、実際のアプリケーションでは、SQLクエリの関係が複雑になる可能性があるため、SQLステートメントをテストするための複雑なセットアップスクリプトを作成する必要があります。

または、 JdbcTemplate オブジェクトをモックして、メソッドの機能をテストすることもできます。

3. H2データベースを使用した単体テスト

H2データベースに接続するデータソースを作成し、それをEmployeeDAOクラスに挿入できます。

@Test
public void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount() {
    DataSource dataSource = new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
      .addScript("classpath:jdbc/schema.sql")
      .addScript("classpath:jdbc/test-data.sql")
      .build();

    EmployeeDAO employeeDAO = new EmployeeDAO();
    employeeDAO.setDataSource(dataSource);

    assertEquals(4, employeeDAO.getCountOfEmployees());
}

このテストでは、最初にH2データベース上にデータソースを構築します。 構築中に、 schema.sql を実行して、EMPLOYEEテーブルを作成します。

CREATE TABLE EMPLOYEE
(
    ID int NOT NULL PRIMARY KEY,
    FIRST_NAME varchar(255),
    LAST_NAME varchar(255),
    ADDRESS varchar(255)
);

また、 test-data.sql を実行して、テストデータをテーブルに追加します。

INSERT INTO EMPLOYEE VALUES (1, 'James', 'Gosling', 'Canada');
INSERT INTO EMPLOYEE VALUES (2, 'Donald', 'Knuth', 'USA');
INSERT INTO EMPLOYEE VALUES (3, 'Linus', 'Torvalds', 'Finland');
INSERT INTO EMPLOYEE VALUES (4, 'Dennis', 'Ritchie', 'USA');

次に、このデータソースを EmployeeDAO クラスに挿入し、メモリ内のH2データベースでgetCountOfEmployeesメソッドをテストできます。

4.モックオブジェクトを使用した単体テスト

JdbcTemplate オブジェクトをモックして、データベースでSQLステートメントを実行する必要がないようにすることができます。

public class EmployeeDAOUnitTest {
    @Mock
    JdbcTemplate jdbcTemplate;

    @Test
    public void whenMockJdbcTemplate_thenReturnCorrectEmployeeCount() {
        EmployeeDAO employeeDAO = new EmployeeDAO();
        ReflectionTestUtils.setField(employeeDAO, "jdbcTemplate", jdbcTemplate);
        Mockito.when(jdbcTemplate.queryForObject("SELECT COUNT(*) FROM EMPLOYEE", Integer.class))
          .thenReturn(4);

        assertEquals(4, employeeDAO.getCountOfEmployees());
    }
}

この単体テストでは、最初に@Mockアノテーションを付けたモックJdbcTemplateオブジェクトを宣言します。 次に、それをに注入します EmployeeDAO オブジェクトを使用して ReflectionTestUtils。 また、 モッキートの戻り結果をモックするユーティリティ JdbcTemplate クエリ。 これにより、データベースに接続せずにgetCountOfEmployeesメソッドの機能をテストできます。

JdbcTemplate クエリをモックするときは、SQLステートメント文字列に完全一致を使用します。 実際のアプリケーションでは、複雑なSQL文字列を作成する可能性があり、完全に一致させることは困難です。 したがって、 anyString()メソッドを使用して、文字列チェックをバイパスすることもできます。

Mockito.when(jdbcTemplate.queryForObject(Mockito.anyString(), Mockito.eq(Integer.class)))
  .thenReturn(3);
assertEquals(3, employeeDAO.getCountOfEmployees());

5. スプリングブート@JdbcTest

最後に、Spring Bootを使用している場合、H2データベースと JdbcTemplate bean:@JdbcTestでテストをブートストラップするために使用できるアノテーションがあります。

このアノテーションを使用してテストクラスを作成しましょう。

@JdbcTest
@Sql({"schema.sql", "test-data.sql"})
class EmployeeDAOIntegrationTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    void whenInjectInMemoryDataSource_thenReturnCorrectEmployeeCount() {
        EmployeeDAO employeeDAO = new EmployeeDAO();
        employeeDAO.setJdbcTemplate(jdbcTemplate);

        assertEquals(4, employeeDAO.getCountOfEmployees());
    }
}

また、 @Sql アノテーションの存在に注意してください。これにより、はテストの前に実行するSQLファイルを指定できます。

6. 結論

このチュートリアルでは、単体テストの複数の方法を示しました JdbcTemplate。

いつものように、記事のソースコードはGitHubから入手できます。