ユニットテストを実行するときにH2/HSQLなどのメモリ内データベースを使用するようにSpring Bootアプリケーションを構成し、Spring Bootアプリケーションを実行するときに本番データベース[Postgre/MySQL]を使用するにはどうすればよいですか。
これには、スプリングプロファイルを使用できます。これは特定の方法です:
環境固有のプロパティファイルがある:
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
_にMySQLとH2ドライバーの両方を次のように配置します。
_<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")
アノテーションを付けます。
別のアプローチは、アノテーション@AutoConfigureTestDatabase
をテストクラスに追加することです。私のテストは通常次のようになります。
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class MyRepositoryTest {
@Autowired
MyRepository repository;
@Test
public void test() throws Exception {
// Tests...
}
}
@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")
を追加する必要があります。
最も簡単なソリューション:
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")でテストクラスに注釈を付けます。
私の場合は魅力のように働いた。
maven
を使用してビルドする場合の簡単なソリューション:application.properties
ファイルsrc/test/resources
およびテストに応じて適切に編集します。
Spring(Boot)プロファイルメカニズムは、スコープ内で「テスト時間と実行時間の間で設定を交換する」だけでなく、非常に強力なツールです。明らかに、実証されたように、それもそれを行うことができます:)
@SpringBootTestマジックを使用すると、次の2つの変更を行うだけで済みます。
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>
@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設定を上書きします。