请提供指针以帮助我模拟该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);