Издевательская Java InputStream
Просьба указать указатели, чтобы помочь мне издеваться над этим объектом java InputStream.
Это строка кода, которую я хотел бы выполнить Mock:
InputStreamReader inputData = new InputStreamReader(System.in);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine();
Ответы
Ответ 1
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"));
Ответ 2
Вы можете использовать commons-io для создания некоторых входных потоков заглушки:
InputStream stubInputStream =
IOUtils.toInputStream("some test data for my input stream", "UTF-8");
Ответ 3
Вы можете просто использовать ByteArrayInputStream
и заполнить его своими тестовыми данными.
Пример @Brad из комментариев:
InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
Ответ 4
Я не согласен с выбранным ответом на этот вопрос. Издевательские структуры, такие как Mockito, хороши и все, однако, когда стандартная java api доступна, вы можете использовать ее вместо этого.
то есть.
BufferedReader reader = new BufferedReader(new StringReader("some string"));
Зачем использовать объект Mock в ваших тестовых классах, когда вы можете использовать реальный со всем его состоянием и поведением?
Чтобы узнать больше о том, как это работает, вы можете посмотреть шаблон дизайна "декоратор".
Ответ 5
Измените свой объект, чтобы его было легче протестировать, например:
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();
}
}
тогда, когда вы используете свой объект, сначала инициализируйте свой входной поток:
MyObject myObject = new MyObject();
myObject.setInputStream(System.in);
Теперь у вас есть объект, где вы можете протестировать его, используя любую реализацию InputStream, которую вы хотите (ByteArrayInputStream - хороший, чтобы попробовать).
Ответ 6
@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();
}
}
Ответ 7
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());
Ответ 8
Лучшим решением, которое я нашел, является использование
final InputStream inputStream1 = IOUtils.toInputStream("yourdata");
а затем оберните inpustream в bufferedReader наилучшим способом записи теста вокруг входного потока
Ответ 9
Предполагая, что вы используете Maven, вы можете поместить ресурс в папку "src/test/resources/", чтобы сказать "src/test/resources/ замечательный-mock-data.xml". Тогда вы можете сделать следующее:
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
(...)
В этом примере varialble URL будет null, если данный ресурс не может быть найден внутри текущего пути к классам. Этот подход позволяет вам размещать несколько сценариев внутри разных resourceInputFile (s)... Также помните, что все виды ресурсов в разделе "src/test/resources/" (а не только файлы xml, такие как txt, html, jpeg и т.д. ) являются нормальными доступными как ресурсы класса из всех тестов jUnit.
Ответ 10
when(imageService.saveOrUpdate(Matchers.<Image>anyObject())).thenReturn(image);
Ссылка http://www.javased.com/?api=org.mockito.Matchers