用于集成测试的嵌入式Java HTTPS服务器

时间:2014-11-27 11:44:14

标签: java jersey mule grizzly

我正在为Mule ESB应用程序编写集成测试,该应用程序通过HTTPS连接到外部API。我想在Maven构建期间模拟外部API并运行端到端集成测试。我的问题是关于设置嵌入式HTTPS服务器。我曾尝试使用Jersey,但它只提供HTTP。我在看这个例子

https://github.com/jersey/jersey/tree/master/examples/https-clientserver-grizzly

我想知道是否还有一些手动步骤,或者每次构建开始时它是否自动设置所有内容。

有任何建议或想法吗?

编辑。我的最终目标是在嵌入式服务器中部署JAX-RS服务,该服务器可通过HTTPS访问。而且这不需要客户端密钥/证书配置。

编辑2.现在我的问题涉及证书。集成测试的重点是模拟外部组件并验证我的应用程序是否正常工作。现在,如果我设置嵌入式HTTPS服务器并使用cmd-line构建的证书,我需要在客户端添加SSL配置(如@Ryan Hoegg指出的那样)。这不是我理想的想法:是否有一个解决方案让它工作没有必须修改我的客户端应用程序代码?这应该是一个超越Mule的一般Java问题。

4 个答案:

答案 0 :(得分:2)

我使用confluex-mock-http。在引擎盖下它使用Jetty,但它为您完成所有配置。创建MockHttpsServer会立即启动HTTPS服务器:

public static final int PORT = 1443;
private MockHttpsServer mockServer;

@Before
public void initHttps() {
    mockServer = new MockHttpsServer(PORT);
    mockServer.respondTo(get("a-service/resource")).withBody(expectedResponse);
}

您可以设置Mule应用程序以信任模拟服务器使用的证书。类路径上提供了JKS格式的信任库,您可以将其提供给HTTPS连接器,如下所示:

<https:connector name="someHttpsConnector">
    <https:tls-server path="confluex-mock.truststore" storePassword="confluex" />
</https:connector>

我认为某些旧版本的mule在使用此方法时遇到问题,因为我需要使用解决方法here

编辑:只有在使用Spring profile运行测试时,才能为HTTPS连接器包含此配置:

<spring:beans profile="test">
    <mule>
        <!-- connector configuration goes here -->
    </mule>
</spring:beans>

在测试运行时确保配置文件确实处于活动状态的一种方法是简单地在@BeforeClass方法中设置它:

@BeforeClass
public void initEnvironment() {
    System.setProperty("spring.profiles.active", "test");
}

答案 1 :(得分:1)

您推荐的示例会自动生效。 我可以考虑的唯一手动部分是安全存储(密钥库,信任库)创建。一旦你拥有了它们,就可以像Grizzly HttpServer那样在示例中完成它。

答案 2 :(得分:0)

如果您愿意嵌入任何其他服务器,请尝试Jetty

有关配置,请参阅此question

答案 3 :(得分:0)

为什么不简单地使用Mule来完成这项任务?

创建一个额外的Mule XML文件,该文件通过HTTPS公开JAX-RS服务。我们的想法是不在生产代码中包含它(即从mule-context.xml中引用它),而是从测试用例中加载它。

您可以将其作为配置与FunctionalTestCase类中的生产配置并行提交。

您的模拟服务看起来有点像这样(不包括提供实际实现的JAX-RS注释bean)。

<flow name="mock-service">
    <https:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8085" path="mockapi"/>
    <jersey:resources>
        <component>
            <spring-object bean="mockApiBean"/>
        </component>
    </jersey:resources>
</flow>