我有一個在AWS環境中運行的Spring Boot應用程序。數據庫是Postgres的,所有的環境變量都外包,所以我必須以不同的配置的application.yml
,他們讀起來就像ENV變量:如何在最新的Spring版本中使用嵌入式db mocking,AWS和配置文件進行適當的Spring啓動測試?
spring:
datasource:
initial-size: 5
url: ${MYAPI_DB_HOST}
username: ${MYAPI_DB_USER}
validation-query: SELECT 1
我想創建一個嵌入式數據庫來測試所有的API,包括SQL查詢。我遵循這個leveluplunch指南。
不幸的是STS已經越過了
@SpringApplicationConfiguration(classes = Application.class)
爲過時。 Spring文檔推薦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}')}"
這是我寫的所有必要的參數運行配置相當驚人/彈簧引導和它適用於所有其他情況(對非數據庫相關函數的簡單運行和單元測試)。如果我用@RunWith(SpringJUnit4ClassRunner.class)替換@RunWith(SpringRunner.class),結果是一樣的。最後,我評論了兩者,然後KMS錯誤沒有再出現,但其他問題淡化:
我試過兩種不同的情況。首先調用一個現有的API,它可以解析從application.yml(app版本,db schemaname)中提取的靜態值。我在控制器測試的另一個測試文件中完全一樣,並且運行良好。第二個是一個經典的jdbc查詢,因爲它是在leveluplunch 指南中。
MyProperties appProp = globalController.getMyProperties();
List<Map<String, Object>> resultSet = jdbcTemplate.queryForList("SELECT * FROM users WHERE userid = 1");
從stacktrace中發現appProp是Null,查詢有NullPointerException。對我來說,似乎env數據甚至沒有從application.yml讀取,但我不明白爲什麼。註釋是否不好?我怎樣才能找到任何適當的文字說明如何做到這一點,而不是向我展示另一個被棄用的舊東西?