请提供指针以帮助我模拟该java InputStream对象。这是我希望模拟的代码行:
InputStreamReader inputData = new InputStreamReader(System.in);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine(); 
请提供指针以帮助我模拟该java InputStream对象。这是我希望模拟的代码行:
InputStreamReader inputData = new InputStreamReader(System.in);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine(); 
Answers:
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("first line"));
Client?抱歉,但是我是mockito和junit的新手,您正在此行上使用Client:org.junit.Assert.when(new Client(bufferedReader).parseLine())
                    您可以使用commons-io创建一些存根输入流:
InputStream stubInputStream = 
     IOUtils.toInputStream("some test data for my input stream", "UTF-8");
toInputStream("someString", "UTF-8")。不推荐使用仅String作为参数的版本。
                    StandardCharsets.UTF_8
                    您可以只使用aByteArrayInputStream并用测试数据填充它。
@Brad的示例来自评论:
InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
ByteArrayInputStream支持mark()和reset()
                    InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
                    我不同意这个问题的答案。像Mockito这样的Mocking框架都很不错,但是当标准的Java api可用时,您可以考虑使用它。
即
BufferedReader reader = new BufferedReader(new StringReader("some string"));
当您可以在状态类和行为类中使用真实对象时,为什么还要在测试类中使用Mock对象呢?
要了解有关其工作原理的更多信息,可以查找“装饰器”设计模式。
更改对象,以便于测试,例如:
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是一个不错的尝试)。
@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());
我发现的最佳解决方案是使用
final InputStream inputStream1 = IOUtils.toInputStream("yourdata");
然后将inpustream包装在bufferedReader中,以最佳方式围绕输入Stream编写测试
假设您正在使用Maven,则可以将资源放入“ src / test / resources /”文件夹中,比如说“ src / test / resources / wonderful-mock-data.xml ”。然后在您的jUnit中可以执行以下操作:
    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 varialble将为null。这种方法允许您将多个方案放在不同的resourceInputFile(s)中。还要记住,所有类型的资源都在“ src / test / resources /”下(不仅是xml文件,还包括txt,html,jpeg等任何类型)。 )通常可以从所有jUnit测试中用作类路径资源。
when(imageService.saveOrUpdate(Matchers.<Image>anyObject())).thenReturn(image);