Дразнящий Java InputStream - PullRequest
       17

Дразнящий Java InputStream

50 голосов
/ 16 июня 2011

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

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

Ответы [ 9 ]

85 голосов
/ 16 июня 2011

Вы можете использовать commons-io для создания входных потоков заглушки:

InputStream stubInputStream = 
     IOUtils.toInputStream("some test data for my input stream", "UTF-8");
74 голосов
/ 16 июня 2011

Вы можете просто использовать ByteArrayInputStream и заполнить его данными теста.

@ Пример Брэда из комментариев:

InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
43 голосов
/ 16 июня 2011
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"));
16 голосов
/ 19 июля 2013

Я не согласен с выбранным ответом на этот вопрос. Среды Mocking, такие как Mockito, хороши и все, однако, когда доступен стандартный Java API, вы можете использовать его вместо этого.

т.е.

BufferedReader reader = new BufferedReader(new StringReader("some string"));

Зачем использовать объект Mock в ваших тестовых классах, если вы можете использовать реальный объект со всем его состоянием и поведением?

Чтобы узнать больше о том, как это работает, вы можете посмотреть шаблон проектирования 'decorator'.

2 голосов
/ 09 февраля 2015
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());
2 голосов
/ 26 марта 2014
@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();
     }
 }
2 голосов
/ 16 июня 2011

Измените ваш объект так, чтобы его было проще тестировать, что-то вроде этого:

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(); 
    }
}

, затем при использовании вашего объекта сначала инициализируйте его inputStream:

MyObject myObject = new MyObject();
myObject.setInputStream(System.in);

Теперь у вас естьобъект, в котором вы можете протестировать его, используя любую реализацию InputStream, которую вы хотите (рекомендуется использовать ByteArrayInputStream).

1 голос
/ 11 сентября 2014

Лучшее решение, которое я нашел, это использовать

final InputStream inputStream1 = IOUtils.toInputStream("yourdata");

, а затем обернуть inpustream в bufferedReader - лучший способ написать тест для входного потока

0 голосов
/ 22 октября 2013

Если вы используете Maven, вы можете поместить ресурс в папку "src / test / resources /", скажем, "src / test / resources / wonderful-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
    (...)

В этом примере переменная url будет null , если данный ресурс не может быть найден внутри текущего пути к классам.Этот подход позволяет вам помещать несколько сценариев в разные resourceInputFile (s) ... Также помните, что все виды ресурсов в "src / test / resources /" (не только файлы XML, любого вида, такие как txt, html, jpeg и т. Д.).) обычно доступны в виде ресурсов classpath из всех тестов jUnit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...