Как я могу заглушить абстрактный класс Java с помощью защищенных абстрактных методов через 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 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]

Конечно, я могу переопределить эти методы в тестовом подклассе, но, может быть, есть более элегантное решение?


person Andrei Tanana    schedule 22.04.2017    source источник


Ответы (1)


Macro Mocks — это подклассы типа mock. Поэтому на них распространяются те же ограничения, что и на обычные иерархии классов в Scala. Вместо того, чтобы напрямую зависеть от абстрактного класса, вы могли бы использовать интерфейс, например. NetworkChannel и издеваться над этим?

пример для расширения видимости метода:

package java.nio.channels;

abstract class ServerSocketChannelSub extends ServerSocketChannel {
  def implCloseSelectableChannel(): Unit
  def implConfigureBlocking(x: Boolean): Unit
}

тогда в вашем тесте

val socketChan = mock[ServerSocketChannelSub]

Все побочные эффекты создания экземпляра этого подкласса также будут применяться к каждому макету, и это невозможно обойти.

person Philipp    schedule 24.04.2017
comment
Извините, не мой случай. Мне нужно ровно ServerSocketChannel методов - person Andrei Tanana; 24.04.2017
comment
Ну тогда нужно быть очень осторожным. Любые побочные эффекты, которые запускаются в конструкторе, также будут выполняться для макета. Чтобы иметь возможность имитировать тип, вы можете создать (все еще абстрактный, если хотите) подкласс, который расширяет видимость защищенных методов пакета для общественности. Я отредактирую ответ выше с примером. - person Philipp; 25.04.2017
comment
Спасибо! Я уже сделал то же самое, и это работает нормально. Просто попросил более элегантное решение, но, похоже, его не существует для текущего API ScalaMock (3.5.0). - person Andrei Tanana; 26.04.2017