Nei test di integrazione (JDK 6) sto provando a catturare tutte le connessioni TCP in uscita ea prenderle in giro. Sembra che dovrei usare il metodo java.net.Socket#setSocketImplFactory()
. Funziona bene al momento, ma non riesco a capire come posso ottenere un accesso alla fabbrica originale, al fine di istanziare la classe SocketImpl
fornita da JDK originale. Ho bisogno di questo principalmente perché voglio che lo delle connessioni esca liberamente, senza prendere in giro. Puoi suggerire alcuni manuali/linee guida/istruzioni su questo problema?Come prendere in giro una connessione socket in uscita?
risposta
In base a javadoc, dovresti essere in grado di utilizzare SocketFactory#getDefault() per ottenere SocketFactory predefinito per il tuo ambiente.
BTW: Si potrebbe anche voler guardare a questo RFE/bug che dichiara che SocketImplFactory è fondamentalmente un vicolo cieco: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4245730
Hai ragione, ma sto parlando di 'SocketImplFactory', che genera istanze della classe' SocketImpl'. La classe 'java.net.Socket' non ha nulla a che fare con tutto questo. – yegor256
Guardando il codice sorgente della classe Socket, non v'è alcuna originali di fabbrica - il i costruttori controllano se factory
è nullo e se lo sono, assegnano semplicemente impl
ad un nuovo PlainSocketImpl()
.
Per quanto ho capito non esiste qualcosa come "il codice sorgente della classe Socket". Ogni JDK ha le sue fonti, che possono differire da implementazione a implementazione. – yegor256
Forse è stato ingenuo da parte mia, ma ho pensato che stavi usando Oracle JDK 6, nel qual caso ci sono fonti specifiche da guardare - l'ho fatto e l'ho usato per spiegare che non c'è fabbrica originale da ottenere(). Se sei in grado di farlo, sono d'accordo con @ Peter Lawrey che usare un servizio è il metodo migliore. Ho dovuto fare lo stesso con Runtime.getRuntime(). http://stackoverflow.com/questions/2257901 – Rich
È una libreria di terze parti all'interno della mia applicazione, che utilizza Socket. Non posso cambiarlo comunque. – yegor256
Invece di prendere in giro uno Socket, creerei un servizio Socket per il socket con cui parlare. Questo può acquisire tutti i dati scritti e rispondere in qualsiasi modo desideri. Può essere eseguito nello stesso test e probabilmente nello stesso thread.
Questa domanda è legata: http://stackoverflow.com/questions/2083647/writing-a-java-net-socketimplfactory – yegor256
Anche in relazione: http://stackoverflow.com/questions/2257901/mock-runtime-getruntime – Rich