2017-04-22 71 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

宏Mock是要模擬的類型的子類。所以他們遵守與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

那麼你需要非常小心。在構造函數中運行的任何副作用也將運行模擬。爲了能夠模擬這種類型,你可以創建一個(如果你喜歡的話仍然是抽象的)子類,它將包保護方法的可見性擴展到public。我將用一個例子來編輯上面的答案。 –

+0

謝謝!我已經做了同樣的事情,它工作正常。只是要求更優雅的解決方案,但目前ScalaMock API(3.5.0)似乎不存在。 –