私はAWS環境で動作するSpring Boot Applicationを持っています。データベースはPostgresの、全ての環境変数が外部委託されているので、私は別のプロファイルを持つapplication.yml
を持っており、彼らは次のようにENV変数を読む:私はSQLクエリを含め、すべてのAPIをテストするための組み込みデータベースを作成したいと思います最新のSpringバージョンで、プロファイル付きの埋め込みdbモッキング、AWSで適切なスプリングブートテストを行うにはどうすればよいですか?
spring:
datasource:
initial-size: 5
url: ${MYAPI_DB_HOST}
username: ${MYAPI_DB_USER}
validation-query: SELECT 1
。私はこのleveluplunchガイドに従った。非推奨と
残念ながら、STSは
@SpringApplicationConfiguration(classes = Application.class)
を超えました。春のドキュメントには、別の注釈を使用することをhereをお勧めします:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
私はJUnitのを走ったと私はエラーだ:私は設定/春のブートを実行するために必要なすべてのパラメータを書いたとしてそれはかなり驚くべきことである
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'kmsEncryptionConfiguration': (.....) nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'aws.region' in string value "#{T(com.amazonaws.regions.Regions).fromName('${aws.region}')}"
をこれは他のすべてのケースで機能しました(非DB依存関数の単体実行テストと単体テスト)。 @RunWith(SpringRunner.class)を@RunWith(SpringJUnit4ClassRunner.class)に置き換えると、結果は同じになります。最後に私は両方をコメントアウトし、KMSエラーはもう表示されませんでしたが、他の問題は薄れていました。
2つの異なるケースを試しました。最初に、既存のAPIを呼び出して、静的な値を返します。これは、application.yml(アプリケーションバージョン、db schemaname)から取得されます。私は、コントローラーテストとうまく動作するための別のテストファイルでまったく同じものを持っていました。 2番目は、leveluplunch ガイドのような古典的なjdbcクエリです。
MyProperties appProp = globalController.getMyProperties();
List<Map<String, Object>> resultSet = jdbcTemplate.queryForList("SELECT * FROM users WHERE userid = 1");
stacktraceからappPropがNullであり、クエリにNullPointerExceptionがあることが判明しました。私にとっては、envデータはapplication.ymlから読み込まれていないようですが、私は理由を理解していません。アノテーションは悪いですか?どのようにしてそれをうまくやるべきかについての適切なテキストを見つけることができますが、それはもう廃止された古いものを私に見せてくれませんか?