【问题标题】:MockWebServer Connection refused: no further informationMockWebServer 连接被拒绝:没有更多信息
【发布时间】:2022-02-03 22:40:57
【问题描述】:

使用具有以下依赖项的 MockWebServer:

testImplementation("com.squareup.okhttp3:mockwebserver")

还有下面的测试类:

class MockWebServerTest() {
    private val mockWebServer = MockWebServer()
    private val client = HttpClient.newBuilder().build()

    @BeforeClass
    fun setup() {
        mockWebServer.start(8081)
        mockWebServer.dispatcher = object : Dispatcher() {
            override fun dispatch(request: RecordedRequest): MockResponse {
                when(request.path){
                    ("success") ->{
                        return MockResponse()
                            .setResponseCode(200)
                            .setBody("success")}
                    ("error") ->{
                        return MockResponse()
                                .setResponseCode(500)
                                .setBody("error")}
                    else -> {
                        return MockResponse()
                                .setResponseCode(200)
                    }
                }
            }
        }
    }

    @AfterClass
    fun teardown() {
        mockWebServer.shutdown()
    }
    @Test
    fun givenMockServerRuns_itShouldRespond(){
        val request = HttpRequest.newBuilder()
                .uri(URI.create("http://localhost:8081/success"))
                .setHeader("Content-Type", "text/html")
                .GET()
                .build()
        val response = client.send(request, HttpResponse.BodyHandlers.ofString())
        assertThat(response.statusCode()).isEqualTo(200)
        assertThat(response.body()).isEqualTo("success")
    }
}

我总是收到Connection refused: no further information。我已经在 stackoverflow 上找到了一些答案,例如 this answer,但我现在不知道这个解决方案是什么意思,我认为它只与 android 相关。

【问题讨论】:

    标签: kotlin mockwebserver


    【解决方案1】:

    我认为您的服务器未启动,因为未调用 setup() 方法。 请确保在测试之前调用了 setup() 方法。 您正在 Kotlin/JVM 上使用 JUnit 4 框架。 在 Java 中,使用 @BeforeClass 注释的方法必须是静态的。 但是您使用的是 Kotlin/JVM,所以我认为您需要像这样使用伴随对象和 @JvmStatic 更改代码:

    class MockWebServerTest() {
        // ...
        companion object {
            @BeforeClass
            @JvmStatic
            fun setup() {
                // ...
            }
            // teardown method also should be here
        }
        // your test
    

    你可以在测试开始时通过mockserver.started()等一些方法来检查服务器是否启动(我不确定具体的方法名是什么)

    @Test
    fun test() {
        assert mockserver.started()
        // your test code
    }
    

    【讨论】:

      【解决方案2】:

      我无法做出Jongho Jeon 给出的答案。 setup 方法实际上根本没有执行。

      为了让它工作,我终于做到了:

      @TestInstance(TestInstance.Lifecycle.PER_CLASS)
      class MockWebServerTest {
      
          private val client = HttpClient.newBuilder().build()
          private val mockWebServer = MockWebServer()
      
          @BeforeAll
          fun setup() {
              mockWebServer.start(8081)
              mockWebServer.dispatcher = object : Dispatcher() {
                  override fun dispatch(request: RecordedRequest): MockResponse {
                      return when(request.path){
                          ("/success") ->{
                              MockResponse()
                                      .setResponseCode(200)
                                      .setBody("success")
                          }
                          ("/error") ->{
                              MockResponse()
                                      .setResponseCode(500)
                                      .setBody("error")
                          }
                          else -> {
                              MockResponse()
                                      .setResponseCode(200)
                          }
                      }
                  }
              }
          }
      
          @AfterAll
          fun teardown() {
              mockWebServer.shutdown()
          }
      
          @Test
          fun givenMockServerRuns_itShouldRespond(){
              val request = HttpRequest.newBuilder()
                      .uri(URI.create("http://localhost:8081/success"))
                      .setHeader("Content-Type", "text/html")
                      .GET()
                      .build()
              val response = client.send(request, HttpResponse.BodyHandlers.ofString())
              assertThat(response.statusCode()).isEqualTo(200)
              assertThat(response.body()).isEqualTo("success")
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 2017-08-08
        相关资源
        最近更新 更多