集成应用程序

在本节中,我们将整合我们测试驱动的应用程序的各个组件。我们将形成一个微服务,运行我们的端点并提供服务的前端 Web 接口。它将使用 Postgres 数据库进行存储。

我们需要编写一个简短的 main() 方法,将代码的主要组件链接在一起。这将涉及创建具体对象并将依赖项注入构造函数中。main() 方法存在于 WordzApplication 类中,这是我们完全集成的 Web 服务的入口点:

package com.wordz;

import com.wordz.adapters.api.WordzEndpoint;
import com.wordz.adapters.db.GameRepositoryPostgres;
import com.wordz.adapters.db.WordRepositoryPostgres;
import com.wordz.domain.Wordz;

public class WordzApplication {
    public static void main(String[] args) {
        var config = new WordzConfiguration(args);
        new WordzApplication().run(config);
    }

    private void run(WordzConfiguration config) {
        var gameRepository
            = new GameRepositoryPostgres(config.getDataSource());
        var wordRepository
            = new WordRepositoryPostgres(config.getDataSource());
        var randomNumbers = new ProductionRandomNumbers();
        var wordz = new Wordz(gameRepository,
            wordRepository,
            randomNumbers);
        var api = new WordzEndpoint(wordz,
            config.getEndpointHost(),
            config.getEndpointPort());

        waitUntilTerminated();
    }

    private void waitUntilTerminated() {
        try {
            while (true) {
                Thread.sleep(10000);
            }
        } catch (InterruptedException e) {
            return;
        }
    }
}

main() 方法实例化了领域模型,并将适配器类的具体版本依赖注入其中。一个值得注意的细节是 waitUntilTerminated() 方法。这可以防止 main() 在应用程序关闭之前终止。这反过来又使 HTTP 端点能够继续响应请求。

应用程序的配置数据保存在 WordzConfiguration 类中。它具有端点主机和端口设置的默认值,以及数据库连接设置。这些也可以通过命令行参数传递。该类及其相关测试可以在本章的 GitHub 代码中看到。

在下一节中,我们将使用流行的 HTTP 测试工具 Postman 来使用 Wordz Web 服务应用程序。