如何通过ScalaMock使用受保护的抽象方法来存根抽象java类?

如何通过ScalaMock使用受保护的抽象方法来存根抽象java类?,scala,scalamock,Scala,Scalamock,我试图存根抽象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

我试图存根抽象
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]
错误:(15,18)无法创建对象,因为:
它有2个未执行的成员。
/**从中可以看出,缺少的签名如下。
*为了方便起见,它们可用作存根实现。
*/
受保护的[package spi]def implCloseSelectableChannel():单位=???
受保护的[package spi]def ImpleConfigureBlocking(x$1:Boolean):单位=???
套接字=存根[ServerSocketChannel]

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

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

扩大方法可见性的示例:

package java.nio.channels;

abstract class ServerSocketChannelSub extends ServerSocketChannel {
  def implCloseSelectableChannel(): Unit
  def implConfigureBlocking(x: Boolean): Unit
}
那么在你的测试中

val socketChan = mock[ServerSocketChannelSub]

构建此子类实例的所有副作用也将应用于每个模拟,无法解决此问题。

对不起,我的情况不是这样。我需要确切的
ServerSocketChannel
methodsWell,然后你需要非常小心。构造函数中运行的任何副作用也将在模拟中运行。为了能够模拟该类型,您可以创建一个子类(如果愿意,仍然是抽象的),该子类将包保护方法的可见性扩大到公共。我将用一个例子来编辑上面的答案。谢谢!我已经做了同样的事情,效果很好。只是要求提供更优雅的解决方案,但对于当前的ScalaMock api(3.5.0)来说似乎不存在。