如何在输入流中模拟zip?

时间:2015-07-28 07:01:04

标签: java mocking zip

生产代码(示例)

class ClassToTest {
  public SomeResult interpreteZipFile(InputStream is) {
    ZippedInputStream zis = new ZippedInputStream(is);
    //other code with something returned
  }
}

不知何故,我想在不使用复杂的外部zip资源的情况下测试我的课程(没人想要)。是否有一些简单的解决方案可以做这样的事情?

classTotest.interpreteZipFile(new MockToBeZippedFile(new ReaderInputStream(new StringReader("some content"))));

我想只是“欺骗”InputStream是一个zip文件而不进入内容的类。

1 个答案:

答案 0 :(得分:0)

复制java.util.zip - Recreating directory structure

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.Deque;
import java.util.LinkedList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipIt {

    public void zipDir(String folderToZip, String zipName) {
        File directory = new File(folderToZip);
        File zipFile = new File(zipName);
        try {
            ZipIt.zip(directory, zipFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void zipDir(String folderToZip, String toLocation, String zipName) {
        this.zipDir(folderToZip, toLocation + File.separator + zipName);
    }

    private static void zip(File directory, File zipfile) throws IOException {
        URI base = directory.toURI();
        Deque<File> queue = new LinkedList<File>();
        queue.push(directory);
        OutputStream out = new FileOutputStream(zipfile);
        Closeable res = out;
        try {
            ZipOutputStream zout = new ZipOutputStream(out);
            res = zout;
            while (!queue.isEmpty()) {
                directory = queue.pop();
                for (File kid : directory.listFiles()) {
                    String name = base.relativize(kid.toURI()).getPath();
                    if (kid.isDirectory()) {
                        queue.push(kid);
                        name = name.endsWith("/") ? name : name + "/";
                        zout.putNextEntry(new ZipEntry(name));
                    } else {
                        zout.putNextEntry(new ZipEntry(name));
                        copy(kid, zout);
                        zout.closeEntry();
                    }
                }
            }
        } finally {
            res.close();
        }
    }

    private static void copy(InputStream in, OutputStream out)
            throws IOException {
        byte[] buffer = new byte[1024];
        while (true) {
            int readCount = in.read(buffer);
            if (readCount < 0) {
                break;
            }
            out.write(buffer, 0, readCount);
        }
    }

    private static void copy(File file, OutputStream out) throws IOException {
        InputStream in = new FileInputStream(file);
        try {
            copy(in, out);
        } finally {
            in.close();
        }
    }
}