テスト用に個別のSpringデータソースを構成する
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のにあります。