1. 概要

JPAなどの永続層に依存するSpringアプリケーションをテストする場合、アプリケーションの実行に使用するデータベースとは異なる、より小さく、より高速なデータベースを使用するようにテストデータソースを設定することができます。テストの実行をはるかに簡単にします。

Springでデータソースを設定するには、手動で、またはSpring Bootを使用している場合は標準のアプリケーションプロパティを使用して、タイプDataSourceのBeanを定義する必要があります。

このクイックチュートリアルでは、Springでテストするための個別のデータソースを構成するいくつかの方法を見ていきます。

2. Mavenの依存関係

SpringJPAとテストを使用してSpringBootアプリケーションを作成するため、次の依存関係が必要になります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> 
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

spring-boot-starter-data-jpa h2 、およびspring-boot-starter-testの最新バージョンはMavenCentralからダウンロードできます。

テスト用にDataSourceを構成するいくつかの異なる方法を見てみましょう。

3. SpringBootでの標準プロパティファイルの使用

SpringBootがアプリケーションの実行時に自動的に取得する標準プロパティファイルはapplication.propertiesと呼ばれ、 src / main /resourcesフォルダーにあります。

テストに異なるプロパティを使用する場合は、 src / test / resources に同じ名前の別のファイルを配置することで、mainフォルダーのプロパティファイルをオーバーライドできます。

src / test /resourcesフォルダー内のapplication.propertiesファイルには、データソースの構成に必要な標準のキーと値のペアが含まれている必要があります。 これらのプロパティには、spring.datasourceというプレフィックスが付いています。

たとえば、H2インメモリデータベースをテストのデータソースとして構成しましょう。

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

Spring Bootはこれらのプロパティを使用して、DataSourceBeanを自動的に構成します。

Spring JPAを使用して、非常に単純なGenericEntityとリポジトリを定義しましょう。

@Entity
public class GenericEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String value;

    //standard constructors, getters, setters
}
public interface GenericEntityRepository
  extends JpaRepository<GenericEntity, Long> { }

次に、リポジトリのJUnitテストを作成しましょう。 Spring Bootアプリケーションでのテストで、定義した標準のデータソースプロパティを取得するには、@SpringBootTestという注釈を付ける必要があります。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SpringBootJPAIntegrationTest {
 
    @Autowired
    private GenericEntityRepository genericEntityRepository;

    @Test
    public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() {
        GenericEntity genericEntity = genericEntityRepository
          .save(new GenericEntity("test"));
        GenericEntity foundEntity = genericEntityRepository
          .findOne(genericEntity.getId());
 
        assertNotNull(foundEntity);
        assertEquals(genericEntity.getValue(), foundEntity.getValue());
    }
}

4. カスタムプロパティファイルの使用

標準のapplication.propertiesファイルとキーを使用したくない場合、またはSpring Bootを使用していない場合は、カスタム.propertiesファイルをカスタムで定義できます。キーを押してから、このファイルを @Configuration クラスで読み取り、含まれている値に基づいて DataSourcebeanを作成します。

このファイルは、アプリケーションの通常の実行モードでは src / main / resources フォルダーに配置され、テストで取得されるように src / test /resourcesに配置されます。

テストにH2インメモリデータベースを使用するpersistence-generic-entity.propertiesというファイルを作成し、 src / test /resourcesに配置しましょう。フォルダ:

jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
jdbc.username=sa
jdbc.password=sa

次に、persistence-generic-entity.propertiesをプロパティソースとしてロードする@Configurationクラスで、これらのプロパティに基づいてDataSourceBeanを定義できます。

@Configuration
@EnableJpaRepositories(basePackages = "org.baeldung.repository")
@PropertySource("persistence-generic-entity.properties")
@EnableTransactionManagement
public class H2JpaConfig {
    // ...
}

この構成のより詳細な例については、インメモリデータベースを使用した自己完結型テストのセクション「JPA構成」に関する以前の記事を参照してください。

次に、構成クラスをロードすることを除いて、前のテストと同様のJUnitテストを作成できます。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class, H2JpaConfig.class})
public class SpringBootH2IntegrationTest {
    // ...
}

5. Springプロファイルの使用

テスト用に個別のDataSourceを構成する別の方法は、Springプロファイルを利用して、testプロファイルでのみ使用可能なDataSourceBeanを定義することです。

このために、以前と同じように .properties ファイルを使用するか、クラス自体に値を書き込むことができます。

テストによってロードされる@ConfigurationクラスのtestプロファイルのDataSourcebeanを定義しましょう。

@Configuration
@EnableJpaRepositories(basePackages = {
  "org.baeldung.repository",
  "org.baeldung.boot.repository"
})
@EnableTransactionManagement
public class H2TestProfileJPAConfig {

    @Bean
    @Profile("test")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
        dataSource.setUsername("sa");
        dataSource.setPassword("sa");

        return dataSource;
    }
    
    // configure entityManagerFactory
    // configure transactionManager
    // configure additional Hibernate properties
}

次に、 JUnit テストクラスで、 @ActiveProfiles アノテーションを追加して、testプロファイルを使用することを指定する必要があります。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
  Application.class, 
  H2TestProfileJPAConfig.class})
@ActiveProfiles("test")
public class SpringBootProfileIntegrationTest {
    // ...
}

6. 結論

このクイックチュートリアルでは、Springでテストするために個別のDataSourceを構成するいくつかの方法を見てきました。

いつものように、例の完全なソースコードはGitHubにあります。