首页 > 解决方案 > 如何在 Java 中创建模拟电子邮件服务?

问题描述

我正在编写一个带有不同模拟服务(例如 HTTP、SFTP、Buckets、Email)的小型测试库。

当谈到电子邮件模拟服务时,我有一个思维障碍。我找到了Apace James 文档一篇文章,但我不知道如何将其调整到我的界面,并且使用 SMTP 服务器会令人困惑。

interface TestServer {

    void start();

    void stop();

}

这个想法是创建一个实现,所以整个设置将在构造函数中,我只需要在设置和拆卸阶段启动和停止 Mock。

我如何使用 Apache James 服务来做到这一点?

我使用 Java 11、Spring Boot 和 JUnit 5。

标签: javatestingsmtpjunit5apache-james

解决方案


您可以通过使用org.apache.james.smtpserver.netty.SMTPServer. 为此,您将需要一些依赖项。

对于Gradle

implementation group: 'org.apache.james', name: 'james-server-protocols-smtp', version: '3.5.0'
implementation group: 'org.apache.james', name: 'metrics-api', version: '3.5.0'
implementation group: 'org.apache.james', name: 'metrics-logger', version: '3.5.0'
implementation group: 'org.apache.james.protocols', name: 'protocols-netty', version: '3.5.0'

对于Maven

    <dependency>
        <groupId>org.apache.james</groupId>
        <artifactId>james-server-protocols-smtp</artifactId>
        <version>3.5.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.james.protocols</groupId>
        <artifactId>protocols-netty</artifactId>
        <version>3.5.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.james</groupId>
        <artifactId>metrics-api</artifactId>
        <version>3.5.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.james</groupId>
        <artifactId>metrics-logger</artifactId>
        <version>3.5.0</version>
    </dependency>

SMTPServer是指标的一部分,james-server-protocols-smtp但其他指标是必需的。

您的接口的示例实现可能如下所示:

public class MySmtpServer implements TestServer {

    private final SMTPServer smtpServer;

    public MySmtpServer(final int port) {
        MetricFactory metricFactory = new DefaultMetricFactory();
        SmtpMetrics smtpMetrics = new SmtpMetricsImpl(metricFactory);
        SMTPServer smtpServer = new SMTPServer(smtpMetrics);
        smtpServer.setListenAddresses(new InetSocketAddress(port));
        this.smtpServer = smtpServer;
    }

    @Override
    public void start() {
        smtpServer.start();
    }

    @Override
    public void stop() {
        smtpServer.stop();
    }
}

推荐阅读