2017-04-22 1 views
0

Je suis en train de bouchonner classe abstraite java.nio.channels.ServerSocketChannel mais nous avons euComment puis-je copier une classe java abstraite avec des méthodes abstraites protégées via ScalaMock?

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] 

Bien sûr, je peux remplacer ces méthodes dans la sous-classe de test, mais peut-être il y a une solution plus élégante? Macro Les macros sont des sous-classes du type à mock.

Répondre

0

Donc, ils respectent les mêmes restrictions que les hiérarchies de classe régulières à Scala. Au lieu de dépendre directement de la classe abstraite, pourriez-vous utiliser une interface, par ex. NetworkChannel et se moquent de ça?

exemple pour élargir la visibilité d'une méthode:

package java.nio.channels; 

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

puis dans votre test

val socketChan = mock[ServerSocketChannelSub] 

Tous les effets secondaires de la construction d'une instance de cette sous-classe s'appliquera également sur chaque maquette, il est pas moyen de contourner cela.

+0

Désolé, ce n'est pas mon cas. J'ai besoin exactement des méthodes 'ServerSocketChannel' –

+0

Eh bien, vous devez être très prudent. Tous les effets secondaires qui s'exécutent dans le constructeur s'exécuteront également pour le simulacre. Pour pouvoir se moquer du type, vous pouvez créer une sous-classe (toujours abstraite si vous préférez) qui élargit la visibilité des méthodes protégées par un paquet à public. Je vais modifier la réponse ci-dessus avec un exemple. –

+0

Merci! Je suis déjà fait la même chose et ça fonctionne bien. Juste demandé une solution plus élégante, mais il ne semble pas exister pour l'API actuelle ScalaMock (3.5.0). –