2011-12-19 17 views
10

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?

+0

Questa domanda è legata: http://stackoverflow.com/questions/2083647/writing-a-java-net-socketimplfactory – yegor256

+0

Anche in relazione: http://stackoverflow.com/questions/2257901/mock-runtime-getruntime – Rich

risposta

0

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

+0

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

0

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().

+0

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

+0

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

+0

È una libreria di terze parti all'interno della mia applicazione, che utilizza Socket. Non posso cambiarlo comunque. – yegor256

1

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.

Problemi correlati