【问题标题】:Unit testing writing to a socket in scala单元测试写入scala中的套接字
【发布时间】:2019-10-26 22:36:01
【问题描述】:

我有以下代码给定一个套接字,将内容写入套接字并基于此返回 RightLeft

class Gateway {
  def sendEvent(
                 str: String,
                 socket: Socket): Either[CustomException, String] = {
    Try {
      val writer =
        new BufferedWriter(new OutputStreamWriter(socket.getOutputStream))


      writer.write(s"${str}\n")
      writer.flush()
    } match {
      case Success(_) => Right(str)
      case Failure(_) => Left(CustomException)
    }
  }
}

我正在尝试对sendEvent 方法进行单元测试。然而这条线

new BufferedWriter(new OutputStreamWriter(socket.getOutputStream))

阻止我这样做。现在,我无法将 BufferedWriter 作为依赖项传递,因为我需要始终打开一个新连接。

我正在使用ScalatestMockito 进行测试。任何关于如何对该代码进行单元测试的想法都将受到高度赞赏。提前谢谢!!!

【问题讨论】:

  • 你应该在 finally 块中 close writer(close 通常调用 flush)。在这种情况下,您可能更喜欢使用 try-catch-finaly 块而不是 Try-match 块。恕我直言,您应该在集成测试中替换单元测试,或者使用OutputStream 而不是Socket。在这种情况下,您可以使用 Socket 添加其他方法。可能有测试库允许您覆盖getOutputStream

标签: scala sockets mockito serversocket scalatest


【解决方案1】:

我认为除了有一个漂亮的测试覆盖率报告之外,对这个类进行单元测试没有任何意义。

在我看来,这段代码应该被更大模块的集成测试间接覆盖。

如果您真的想单独测试它,我会在测试中启动本地测试服务器并向其发送消息。

此类测试宁愿验证您对套接字工作流程的理解,而不是业务逻辑。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多