[英]How to prevent using production MongoDB URI in spock micronaut tests
我如何確保我的測試永遠不會在我的 Micronaut 應用程序中使用生產 MongoDB URI?
我目前在我的測試配置中使用嵌入式服務器來使用測試 MongoDB 容器運行我的測試,如下所示:
@MicronautTest
class JwtAuthenticationSpec extends Specification {
final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:6.0.3"))
.withExposedPorts(27017)
def setup() {
mongoDBContainer.start()
embeddedServer = ApplicationContext.run(EmbeddedServer,
['mongodb.uri': "${mongoDBContainer.connectionString}/fire"]) //sets the uri to the test containers one
}
//...
而我的 application.yml 中的 MongoDB 配置是這樣的:
mongodb:
uri: ${MONGO_PROD_URI}
我擔心的是未來的開發人員可能會創建一個新的測試,使用沒有嵌入式服務器的新客戶端,這意味着測試將使用生產 url 對嗎? 我怎樣才能避免這種情況以確保測試永遠不會使用生產 url?
請參閱指南訪問 MongoDB 數據庫和 Micronaut 數據 MongoDB演示使用 MongoDB 和 Micronaut 測試資源以及如何在生產中運行:
當應用程序在本地啟動時——無論是在測試中還是通過運行應用程序——屬性 mongodb.uri 的解析被檢測到,測試資源服務將啟動本地 MongoDB docker 容器,並注入將其用作數據源所需的屬性。
在生產環境下運行時,您應該通過環境變量將此屬性替換為生產 MongoDB 實例的位置。
MONGODB_URI=mongodb://username:password@production-server:27017/databaseName
更多信息
測試資源文檔中關於 MongoDB 的部分很少。 從介紹部分:
測試資源僅在開發期間可用(例如,當運行 Gradle
run
任務或 Mavenmn:run
目標時)和測試執行:生產代碼將需要資源可用。
簡而言之,Micronaut Test Resources 會為您處理啟動 TestContainer。
測試資源不會阻止開發人員將生產 URI 設置為環境變量或屬性文件。
你可以這樣做:
/test/java/com/example/MongoContainer.java
@Factory
@Requires(env = Environment.TEST)
@Replaces(factory = DefaultMongoClientFactory.class)
public class MongoContainer {
@Bean(preDestroy = "close")
@Singleton
@Primary
public MongoClient create(MongoClientSettings settings) {
MongoDBContainer container = new MongoDBContainer(DockerImageName.parse("mongo:6.0.3"))
.withExposedPorts(27017);
container.start();
MongoClientSettings testClientSettings = MongoClientSettings.builder(settings).applyConnectionString(
new ConnectionString(container.getConnectionString() + "/fire")).build();
return MongoClients.create(testClientSettings);
}
}
對於測試環境,這將忽略mongodb.uri
屬性,您的測試用例不需要啟動容器。 注意:還可以在上面的工廠中為圖像名稱( "mongo:6.0.3"
)添加一個屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.