web-dev-qa-db-ja.com

Springでのテスト用に特定のメモリデータベースを構成する

ユニットテストを実行するときにH2/HSQLなどのメモリ内データベースを使用するようにSpring Bootアプリケーションを構成し、Spring Bootアプリケーションを実行するときに本番データベース[Postgre/MySQL]を使用するにはどうすればよいですか。

38
IllSc

これには、スプリングプロファイルを使用できます。これは特定の方法です:

環境固有のプロパティファイルがある:

application.properties

_spring.profiles.active: dev
_

application-dev.properties

_spring.jpa.database: MYSQL
spring.jpa.hibernate.ddl-auto: update

spring.datasource.url: jdbc:mysql://localhost:3306/dbname
spring.datasource.username: username
spring.datasource.password: password
_

application-test.properties

_spring.jpa.database: HSQL
_

_pom.xml_にMySQLH2ドライバーの両方を次のように配置します。

_<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>test</scope>
</dependency>
_

最後になりますが、テストクラスに@ActiveProfiles("test")アノテーションを付けます。

51
Sanjay

別のアプローチは、アノテーション@AutoConfigureTestDatabaseをテストクラスに追加することです。私のテストは通常​​次のようになります。

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class MyRepositoryTest {

    @Autowired
    MyRepository repository;

    @Test
    public void test() throws Exception {
        // Tests...
    }
}
28
ronhash

@Sanjayには1つの方法がありますが、わかりにくいです。実稼働中に有効にするproductionプロファイルのみを持つこともできます。

_spring.jpa.hibernate.ddl-auto: update
spring.datasource.url: jdbc:mysql://localhost:3306/dbname
spring.datasource.username: username
spring.datasource.password: password
_

そして、他に何も指定しないでください。 testスコープに組み込みデータベースを追加すると、テストで使用可能になります。デフォルトのプロファイル(カスタマイズなし)でテストを実行する場合、データベース情報は見つかりません(これらはproductionプロファイルに保存されているため)。その場合、組み込みデータベースを見つけて起動しようとします。何らかの理由でさらにカスタマイズが必要な場合は、それらに_application-test.properties_を使用できます(テストにActiveProfiles("test")を追加する必要があります。

6
Stephane Nicoll

最も簡単なソリューション:

1)src/main/resourcesにはapplication.properties(運用設定)があります:

spring.datasource.url=jdbc:mysql://localhost:3306/somedb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect

およびapplication-test.propertiesとHSQL構成:

spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.database = HSQL
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect
spring.datasource.driverClassName = org.hsqldb.jdbcDriver
spring.datasource.url= jdbc:hsqldb:mem:scratchdb
spring.datasource.username = sa
spring.datasource.password =

2)pom.xmlにHSQL依存関係がまだない場合は追加します。

3)@ActiveProfiles( "test")でテストクラスに注釈を付けます。

私の場合は魅力のように働いた。

5
jarosik

mavenを使用してビルドする場合の簡単なソリューション:application.propertiesファイルsrc/test/resourcesおよびテストに応じて適切に編集します。

Spring(Boot)プロファイルメカニズムは、スコープ内で「テスト時間と実行時間の間で設定を交換する」だけでなく、非常に強力なツールです。明らかに、実証されたように、それもそれを行うことができます:)

5
demaniak

@SpringBootTestマジックを使用すると、次の2つの変更を行うだけで済みます。

  1. Pom.xmlに「h2」テスト依存関係を追加します
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>
  1. @ AutoConfigureTestDatabase を使用
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MySpringBootApplication.class)
@AutoConfigureTestDatabase
public class SpringBootTest{

    @Autowired
    private RequestRepository requestRepository;
}

これで、テストで使用されるすべてのSpring JPA Bean /リポジトリは、バッキングデータベースとしてh2を使用します。

2019-04-26 13:13:34.198 INFO 28627 --- [main] beddedDataSourceBeanFactoryPostProcessor: 'dataSource' DataSource Beanを埋め込みバージョンに置き換える

2019-04-26 13:13:34.199 INFO 28627 --- [main] o.s.b.f.s.DefaultListableBeanFactory:Bean 'dataSource'のBean定義をオーバーライドします

2019-04-26 13:13:36.194 INFO 28627 --- [main] osjdeEmbeddedDatabaseFactory:組み込みデータベースの開始:url = 'jdbc:h2:mem:2784768e-f053-4bb3-ab88-edda34956893; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = false '、ユーザー名=' sa '

注:「application.properties」で「spring-jpa」プロパティがまだ定義されており、プロファイルを使用していません。 @ AutoConfigureTestDatabase は、テストのデフォルトAutoConfigureTestDatabase.Replaceで既存のjpa設定を上書きします。

1
147.3k