Подтвердить что ты не робот

Издевательская Java InputStream

Просьба указать указатели, чтобы помочь мне издеваться над этим объектом java InputStream. Это строка кода, которую я хотел бы выполнить Mock:

InputStreamReader inputData = new InputStreamReader(System.in);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine(); 
4b9b3361

Ответ 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.