Si tuviera que probar el código, yo haría lo siguiente.
En primer lugar, refactorice el código para que el Socket
no esté directamente instanciado en el método que desea probar. El siguiente ejemplo muestra el cambio más pequeño que puedo pensar para que eso suceda. Los cambios futuros pueden tener en cuenta la creación de Socket
en una clase completamente separada, pero me gustan los pasos pequeños y no me gusta hacer grandes cambios en el código no probado.
public boolean sendTo(String hostname, int port) {
boolean sent = false;
try {
Socket socket = createSocket();
OutputStream out = socket.getOutputStream();
out.write(payload);
socket.close();
sent = true;
} catch (UnknownHostException e) {
// TODO
} catch (IOException e) {
// TODO
}
return sent;
}
protected Socket createSocket() {
return new Socket();
}
Ahora que la lógica de la creación toma se encuentra fuera del método que está tratando de probar, puede comenzar a burlarse de las cosas y el gancho en la creación del zócalo.
public class MessageTest {
@Test
public void testSimplePayload()() {
byte[] emptyPayload = new byte[1001];
// Using Mockito
final Socket socket = mock(Socket.class);
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
when(socket.getOutputStream()).thenReturn(byteArrayOutputStream);
Message text = new Message(emptyPayload) {
@Override
protected Socket createSocket() {
return socket;
}
};
Assert.assertTrue("Message sent successfully", text.sendTo("localhost", "1234"));
Assert.assertEquals("whatever you wanted to send".getBytes(), byteArrayOutputStream.toByteArray());
}
}
métodos individuales imperativos de unidades que desea probar es realmente útil para las pruebas, especialmente en código feo, con dependencias horribles. Obviamente, la mejor solución es resolver dependencias (en este caso, creo que Message
no depende de Socket
, tal vez haya una interfaz Messager
como lo sugiere el glowcoder), pero es bueno avanzar hacia la solución en los pasos más pequeños posibles.
En lugar de burlarse de un zócalo es mucho más simple en mi humilde opinión para crear un ServerSocket real (toma dos líneas) –