【问题标题】:How I can stub abstract java class with protected abstract methods via ScalaMock?如何通过 ScalaMock 使用受保护的抽象方法存根抽象 java 类?
【发布时间】:2017-04-26 01:02:40
【问题描述】:

我正在尝试存根抽象 java.nio.channels.ServerSocketChannel 类但得到了

Error:(15, 18) object creation impossible, since:
it has 2 unimplemented members.
/** As seen from <$anon: java.nio.channels.ServerSocketChannel>, the missing signatures are as follows.
 *  For convenience, these are usable as stub implementations.
 */
  protected[package spi] def implCloseSelectableChannel(): Unit = ???
  protected[package spi] def implConfigureBlocking(x$1: Boolean): Unit = ???
    socket = stub[ServerSocketChannel]

当然我可以在测试子类中重写这些方法,但也许有更优雅的解决方案?

【问题讨论】:

    标签: scala scalamock


    【解决方案1】:

    Macro Mocks 是要模拟的类型的子类。因此它们遵守与 Scala 中常规类层次结构相同的限制。 除了直接依赖抽象类,您可以使用接口吗,例如NetworkChannel 并模拟它?

    扩展方法可见性的示例:

    package java.nio.channels;
    
    abstract class ServerSocketChannelSub extends ServerSocketChannel {
      def implCloseSelectableChannel(): Unit
      def implConfigureBlocking(x: Boolean): Unit
    }
    

    然后在你的测试中

    val socketChan = mock[ServerSocketChannelSub]
    

    构造这个子类的实例的所有副作用也将适用于每个模拟,没有办法解决这个问题。

    【讨论】:

    • 对不起,不是我的情况。我需要 ServerSocketChannel 方法
    • 那么你需要非常小心。在构造函数中运行的任何副作用也将为模拟运行。为了能够模拟该类型,您可以创建一个(如果您愿意,仍然是抽象的)子类,将包保护方法的可见性扩大到公共。我将用一个例子来编辑上面的答案。
    • 谢谢!我已经做了同样的事情,而且效果很好。只是要求提供更优雅的解决方案,但当前的 ScalaMock api(3.5.0) 似乎不存在。
    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多