2017-04-22 10 views
0

私は抽象クラスjava.nio.channels.ServerSocketChannelスタブしようとしているが、私はテストサブクラスでこれらのメソッドをオーバーライドすることができますが、おそらくよりエレガントな解決策がある。もちろん、ScalaMockを使って抽象的なJavaクラスを保護された抽象メソッドでスタブする方法はありますか?

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] 

を持っていますか?

答えて

0

マクロモックは、模擬するタイプのサブクラスです。したがって、Scalaでは通常のクラス階層と同じ制限が適用されます。 抽象クラスに直接依存するのではなく、インタフェースを使用できますか? NetworkChannelとそれを嘲笑?メソッドの可視性を広げるため

例:

その後、
package java.nio.channels; 

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

あなたのテストでは、このサブクラスのインスタンスを構築する

val socketChan = mock[ServerSocketChannelSub] 

すべての副作用もあり、各モックに適用されますこれを回避する方法はありません。

+0

申し訳ありませんが、私の場合はありません。私はちょうど 'ServerSocketChannel'メソッドが必要です –

+0

あなたは非常に注意する必要があります。コンストラクタ内で実行される副作用は、モックに対しても実行されます。型を模倣できるようにするには、パッケージ保護されたメソッドの可視性を公開するように拡張するサブクラスを作成することができます。上記の答えを例で編集します。 –

+0

ありがとう!私はすでに同じことをしており、それは正常に動作します。もっと洗練されたソリューションを求めていましたが、現在のScalaMock API(3.5.0)では存在しないようです。 –

関連する問題