嘲笑Java InputStream

请指点一下,帮我嘲笑java的InputStream对象。 这是我希望模拟的代码行:

InputStreamReader inputData = new InputStreamReader(System.in); bufferdReader = new BufferedReader(inputData); bufferdReader.readLine(); 
 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")); 

您可以使用commons-io创build一些存根inputstream:

 InputStream stubInputStream = IOUtils.toInputStream("some test data for my input stream", "UTF-8"); 

您可以使用ByteArrayInputStream并将其填入您的testing数据。

@布拉德的例子从评论:

 InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes()); 

我不同意这个问题的select答案。 像Mockito这样的模拟框架是很好的,但是当标准的java API可用时,你可能会考虑使用它。

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

为什么在你的testing类中使用一个Mock对象,当你可以使用一个具有所有状态和行为的真实对象?

要了解更多关于这是如何工作的,可以查看“装饰者”devise模式。

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

改变你的对象,这样更容易testing,像这样:

 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实现来testing它(ByteArrayInputStream是一个很好的尝试)。

我发现最好的解决scheme是使用

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

然后用bufferedReader把inpustream包装成最好的方式来写inputstream的testing

假设你正在使用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 (...) 

在这个例子中,如果在当前类path中找不到给定的资源,则url varialble将为 。 这种方法允许你在不同的resourceInputFile(s)中放置多个场景…还要记住“src / test / resources /”下的所有资源(不只是xml文件,像txt,html,jpeg等)通常都是来自所有jUnittesting的类path资源。