mockitojunitrunner - Burlándose de Java InputStream
mockito mock method (9)
Cambie su objeto para que sea más fácil de probar, algo como esto:
public MyObject {
private InputStream inputStream;
public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}
public void whatever() {
InputStreamReader inputData = new InputStreamReader(inputStream);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine();
}
}
luego, cuando usa su objeto, inicialice su inputStream primero:
MyObject myObject = new MyObject();
myObject.setInputStream(System.in);
Ahora tiene un objeto en el que puede probarlo utilizando cualquier implementación de InputStream que desee (ByteArrayInputStream es una buena opción).
Por favor, proporcione punteros que me ayuden a simular ese objeto java InputStream Esta es la línea de código que me gustaría burlar:
InputStreamReader inputData = new InputStreamReader(System.in);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine();
La mejor solución que encontré es el uso.
final InputStream inputStream1 = IOUtils.toInputStream("yourdata");
y luego envuelva el inpustream en bufferedReader la mejor manera de escribir la prueba alrededor de la corriente de entrada
No estoy de acuerdo con la respuesta seleccionada para esta pregunta. Los marcos burlones como Mockito son agradables y todo, sin embargo, cuando la API java estándar está disponible, podrías considerar usar eso en su lugar.
es decir
BufferedReader reader = new BufferedReader(new StringReader("some string"));
¿Por qué usar un objeto simulado en sus clases de prueba cuando podría usar uno real con todo su estado y comportamiento?
Para ver más sobre cómo funciona esto, puede buscar el patrón de diseño ''decorador''.
Podría usar commons-io para crear algunas secuencias de entrada de código auxiliar:
InputStream stubInputStream =
IOUtils.toInputStream("some test data for my input stream", "UTF-8");
Simplemente puede usar un ByteArrayInputStream
y llenarlo con sus datos de prueba.
El ejemplo de @Bad de los comentarios:
InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
Suponiendo que está utilizando Maven, puede poner un recurso en la carpeta "src / test / resources /" digamos "src / test / resources / wonderful-mock-data.xml ". Entonces en ti puedes hacer lo siguiente:
String resourceInputFile = "/database-insert-test.xml";
URL url = this.getClass().getResource(resourceInputFile);
Assert.assertNotNull("Can''t find resource " + resourceInputFile, url);
InputStream inputStream = url.openStream();
// Now you can just use the inputStream for method calls requiring this param
(...)
En este ejemplo, la variable url será nula si el recurso dado no se puede encontrar dentro del classpath actual. Este enfoque le permite colocar múltiples escenarios dentro de diferentes ResourceInputFile (s) ... También recuerde que todo tipo de recursos en "src / test / resources /" (no solo archivos xml, cualquier tipo como txt, html, jpeg, etc.) ) normalmente están disponibles como recursos de classpath de todas las pruebas jUnit.
@Test
public void testReadFile() {
TestClass ClassName = Mockito.mock(TestClass.class);
InputStream in = Mockito.mock(InputStream.class);
InputStreamReader inr =Mockito.mock(InputStreamReader.class);
BufferedReader bufferedReader =Mockito.mock(BufferedReader.class);
try {
PowerMockito.whenNew(InputStreamReader.class).withArguments(in).thenReturn(inr);
PowerMockito.whenNew(BufferedReader.class).withArguments(inr).thenReturn(bufferedReader);
String line1 = "example line";
PowerMockito.when(bufferedReader.readLine()).thenReturn(line1).thenReturn(null);
method return type = Whitebox.invokeMethod(ClassName, "MethodName", arguement);
assertEquals("result is::","expected", actual);
} catch (Exception e) {
e.printStackTrace();
}
}
BufferedReader bufferedReader = org.mockito.Mockito.mock(BufferedReader.class);
when(bufferedReader.readLine()).thenReturn("first line").thenReturn("second line");
org.junit.Assert.when(new Client(bufferedReader).parseLine()).thenEquals(IsEqual.equalTo("1"));
String testString = "test/nstring";
InputStream stream = new ByteArrayInputStream(testString.getBytes(StandardCharsets.UTF_8));
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
Assert.assertEquals("test", reader.readLine());
Assert.assertEquals("string", reader.readLine());