WireMock 的集成测试失败,因为未找到 ALPN 处理器
Integration tests with WireMock failing because no ALPN Processors are found
我正在为用 Kotlin 编写的 Spring 引导应用程序编写一些集成测试。为了存根一些 HTTP 请求,我通过 spring-cloud-contract-wiremock
使用 WireMock 作为依赖项。
来自集成测试的一些匿名示例代码:
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureWireMock
class MyIntegrationTest {
@Test
fun `some test`() {
mockEndpoint("url", 500, someResponseBodyInJson)
mockMvc.perform(
MockMvcRequestBuilders
.post("url")
.contentType(MediaType.APPLICATION_JSON.toString())
.content(someRequestBodyInJson)
)
.andExpect(MockMvcResultMatchers.status().isInternalServerError)
}
private fun mockEndpoint(url: String, responseCode: Int, responseBody: String) {
stubFor(
WireMock.post(url).willReturn(
WireMock.aResponse()
.withStatus(responseCode)
.withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString())
.withBody(responseBody)
)
)
}
}
虽然 运行 这些测试是在我的本地机器上进行的,但一切正常。在 CI/CD 环境中它失败了,但出现以下错误:
java.lang.IllegalStateException: No Server ALPNProcessors!
at wiremock.org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory.<init>(ALPNServerConnectionFactory.java:52)
我进行了一些搜索,发现这与 Jetty 在 class 路径上遗漏了一些东西有关。我添加了以下依赖项 testImplementation("org.eclipse.jetty:jetty-alpn-server:11.0.7")
,但测试仍然失败。由于正在使用 JDK 11,因此不需要 alpn-boot
扩展名。
谁能帮我解决这个问题?我需要另一个依赖项还是我看错方向了?
降级到 Jetty 9。4.x
Wiremock 不支持 Jetty 10 或 Jetty 11。
此外,Spring 不支持 Jetty 11(在新命名空间 jakarta.servlet
上使用 Jakarta EE 9 和 Servlet 5.0)
Wiremock 团队在 2.32 版中解决了这个问题,有一个票证 here。您需要为 wiremock-jre8-standalone
指定正确的版本以覆盖由 Spring:
提取的旧版本
# Gradle
testImplementation 'com.github.tomakehurst:wiremock-jre8-standalone:2.32.0'
#Maven
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8-standalone</artifactId>
<version>2.32.0</version>
<scope>test</scope>
</dependency>
我正在为用 Kotlin 编写的 Spring 引导应用程序编写一些集成测试。为了存根一些 HTTP 请求,我通过 spring-cloud-contract-wiremock
使用 WireMock 作为依赖项。
来自集成测试的一些匿名示例代码:
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureWireMock
class MyIntegrationTest {
@Test
fun `some test`() {
mockEndpoint("url", 500, someResponseBodyInJson)
mockMvc.perform(
MockMvcRequestBuilders
.post("url")
.contentType(MediaType.APPLICATION_JSON.toString())
.content(someRequestBodyInJson)
)
.andExpect(MockMvcResultMatchers.status().isInternalServerError)
}
private fun mockEndpoint(url: String, responseCode: Int, responseBody: String) {
stubFor(
WireMock.post(url).willReturn(
WireMock.aResponse()
.withStatus(responseCode)
.withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString())
.withBody(responseBody)
)
)
}
}
虽然 运行 这些测试是在我的本地机器上进行的,但一切正常。在 CI/CD 环境中它失败了,但出现以下错误:
java.lang.IllegalStateException: No Server ALPNProcessors!
at wiremock.org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory.<init>(ALPNServerConnectionFactory.java:52)
我进行了一些搜索,发现这与 Jetty 在 class 路径上遗漏了一些东西有关。我添加了以下依赖项 testImplementation("org.eclipse.jetty:jetty-alpn-server:11.0.7")
,但测试仍然失败。由于正在使用 JDK 11,因此不需要 alpn-boot
扩展名。
谁能帮我解决这个问题?我需要另一个依赖项还是我看错方向了?
降级到 Jetty 9。4.x
Wiremock 不支持 Jetty 10 或 Jetty 11。
此外,Spring 不支持 Jetty 11(在新命名空间 jakarta.servlet
上使用 Jakarta EE 9 和 Servlet 5.0)
Wiremock 团队在 2.32 版中解决了这个问题,有一个票证 here。您需要为 wiremock-jre8-standalone
指定正确的版本以覆盖由 Spring:
# Gradle
testImplementation 'com.github.tomakehurst:wiremock-jre8-standalone:2.32.0'
#Maven
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8-standalone</artifactId>
<version>2.32.0</version>
<scope>test</scope>
</dependency>