在不创建文件的情况下测试 outputstream.write(<String>)



我正在用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();
}

相关内容

  • 没有找到相关文章

最新更新