簡體   English   中英

如何防止在 spock micronaut 測試中使用生產 MongoDB URI

[英]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 數據庫和 Micronaut 數據 MongoDB演示使用 MongoDB 和 Micronaut 測試資源以及如何在生產中運行:

當應用程序在本地啟動時——無論是在測試中還是通過運行應用程序——屬性 mongodb.uri 的解析被檢測到,測試資源服務將啟動本地 MongoDB docker 容器,並注入將其用作數據源所需的屬性。

在生產環境下運行時,您應該通過環境變量將此屬性替換為生產 MongoDB 實例的位置。

MONGODB_URI=mongodb://username:password@production-server:27017/databaseName

更多信息

測試資源文檔中關於 MongoDB 的部分很少。 從介紹部分:

測試資源僅在開發期間可用(例如,當運行 Gradle run任務或 Maven mn: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM