WireMock 每个测试用例设置挂在第二个测试

Jus*_*ler 5 java spring unit-testing mocking freeze

我正在使用 WireMock 来测试 Spring Boot Web 应用程序,该应用程序本身使用 Jetty,但在不同的端口上。

我看到的是,如果我使用基本规则配置:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8006); 
Run Code Online (Sandbox Code Playgroud)

stubFor在一个@Before方法中使用,然后立即跟进调用存根 URL(通过 Spring 的RestTemplate),第一个测试用例顺利运行,但第二个测试用例挂起。相关堆栈跟踪的位是:

"main" prio=10 tid=0x00007f60a4009000 nid=0xb8d0 runnable [0x00007f60abcec000]
    java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:146)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    - locked <0x00000000f33e8d00> (a java.io.BufferedInputStream)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:688)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:767)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1162)
    - locked <0x00000000f33da7c8> (a sun.net.www.protocol.http.HttpURLConnection)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:397)
    at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:48)
    at org.springframework.http.client.AbstractClientHttpResponse.getStatusCode(AbstractClientHttpResponse.java:33)
    at org.springframework.web.client.DefaultResponseErrorHandler.getHttpStatusCode(DefaultResponseErrorHandler.java:56)
    at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:50)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:542)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:502)
    at org.springframework.web.client.RestTemplate.put(RestTemplate.java:381)
Run Code Online (Sandbox Code Playgroud)

如果我改为使用“入门”页面上显示的静态方法,则一切正常。我可以使用静态方法,以便每个类启动/停止 WireMock 一次,但为了我自己的启发,我很想知道为什么另一个案例没有按预期工作。

更新:刚刚注意到大约 200 秒后,测试失败:

nested exception is java.net.SocketException: Unexpected end of file from server
Run Code Online (Sandbox Code Playgroud)

谢谢,贾斯汀

ani*_*cos 1

在我的项目中,我使用 WireMock 的随机端口 @Rule WireMockRulewireMockRule = new WireMockRule(Options.DYNAMIC_PORT)

而且它运行完美。这是更好的解决方案,因为更改后您可以并行运行测试:)