我正在用java测试一个输出流,如下所示。
Writer outputStream = getOutputStream(fileName);
if(outputStream != null) {
try {
outputStream.write(inputText);
}
finally {
outputStream.close();
}
}
else {
throw new IOException("Output stream is null");
}
我正在写一个mockito测试如下
public void testFileWrite() throws IOException {
when(testObj.getOutputStream(outputFileNameValidValue)).thenReturn(outputStreamMock);
doNothing().when(outputStreamMock).write(Matchers.anyString());
doNothing().when(bufferedReaderMock).close();
testObj.write(outputFileNameValidValue, reveredFileInput);
verify(outputStreamMock).write(Matchers.anyString());
verify(outputStreamMock).close();
}
问题是创建OutputStreamWriter(new FileOutputStream(filename))
时,会在磁盘上创建一个物理文件。
我们可以在不实际在磁盘上写入文件的情况下测试Outputstream.write
吗?
谢谢Anand
您可以使用ByteArrayOutputStream将数据写入内存。您可以使用ByteArrayInputStream读取此内容。
另一种选择是编写一个预期的OutputStream,一旦您尝试写入不正确的字节,它就会失败。这有助于了解测试失败的确切位置/原因。
您可以尝试将System.out用于您的输出,它实际上是一个Printstream,它是OutputStream 的子类
请参阅:http://docs.oracle.com/javase/6/docs/api/java/lang/System.htmlhttp://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html
正如其他人已经建议的那样,您需要能够在测试中的类中注入模拟的OutputStream。由于测试中的类需要一个OutputStream来写入给定的文件,因此需要将一个可模拟的OutputStreamFactory注入测试中的类中。
我有这个代码给你,它是完全独立的:
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.IOException;
import java.io.OutputStream;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class Test9328173 {
private ClassUnderTest testObj;
@Mock
private OutputStreamFactory factory;
@Mock
private OutputStream stream;
@Before
public void setUp() throws Exception {
testObj = new ClassUnderTest();
testObj.factory = factory;
}
@Test
public void testFileWrite() throws Exception {
when(factory.create("filename")).thenReturn(stream);
testObj.write("filename", new byte[]{1, 2, 3});
verify(stream).write(new byte[]{1, 2, 3});
verify(stream).close();
}
private class ClassUnderTest {
private OutputStreamFactory factory;
public void write(String filename, byte[] content) throws IOException {
OutputStream stream = factory.create(filename);
try {
stream.write(content);
} finally {
stream.close();
}
}
}
private interface OutputStreamFactory {
OutputStream create(String filename);
}
}
您应该模拟您的getOutputStream
:is应该返回模拟的输出流对象。调用new FileOutputStream
确实会在磁盘上创建文件。
理论上,您可以模拟文件系统本身,但它要复杂得多。
BTW if(outputStream != null)
是多余的:流永远不能为空。如果无法创建,则该方法应抛出异常。它不是C,而是Java。:)
您应该让模拟的getOutputStream(String)
返回一个java.io.StringWriter
,然后您可以断言预期的内容已经编写完成。
public void testFileWrite() throws IOException {
StringWriter writer = new StringWriter();
when(testObj.getOutputStream(outputFileNameValidValue)).thenReturn(writer);
testObj.write(outputFileNameValidValue, reveredFileInput);
assertEquals(reveredFileInput, writer.toString());
verify(writer).close();
}