2017-08-01 56 views
0

我有一個在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讀取,但我不明白爲什麼。註釋是否不好?我怎樣才能找到任何適當的文字說明如何做到這一點,而不是向我展示另一個被棄用的舊東西?

回答

0

我已經做了一個關於用H2測試Spring Boot API的基本示例。它連接到Postgres數據庫。在maven安裝時,它不會調用application.yml中的默認配置文件,但測試配置文件會創建一個H2數據庫,插入表,插入記錄,對它們執行測試。

我希望它能幫助其他Spring開發者。

https://github.com/somahargitai/H2test

相關問題