请给我一些指针来帮助我模拟那个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();
InputStream stubInputStream =
IOUtils.toInputStream("some test data for my input stream", "UTF-8");
toInputStream(“someString”,“UTF-8”)
。仅带有字符串参数的版本已不建议使用。 - JonyDStandardCharsets.UTF_8
代替非类型安全的字符串。 - dcasadevallByteArrayInputStream
,并用你的测试数据填充它。
@Brad在评论中提供了一个示例:
InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
ByteArrayInputStream
φî·φ¨¹mark()
壨reset()
ψIJ - HankInputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
(将字符串"test data"转换成字节数组,并创建一个ByteArrayInputStream对象anyInputStream来读取这个字节数组中的数据) - Bradval inputStream = "test data".byteInputStream()
- swoobyBufferedReader 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())
- Alejandro Sanchez我不同意这个问题选定的答案。像Mockito这样的模拟框架虽然不错,但是当标准Java API可用时,考虑使用它们可能更好。
即
BufferedReader reader = new BufferedReader(new StringReader("some string"));
当你可以使用一个具有所有状态和行为的真实对象时,为什么要在测试类中使用 Mock 对象呢?
要了解更多关于此工作原理的信息,可以查找“装饰器”设计模式。
@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();
}
}
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);
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");
然后将输入流包装在BufferedReader中,这是编写围绕输入流进行测试的最佳方式。
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
(...)
when(imageService.saveOrUpdate(Matchers.<Image>anyObject())).thenReturn(image);