java - JUnit测试扫描文件夹类

标签 java unit-testing junit mkdir

我想编写几个测试,但从高层来看,每个测试都应该用一些文件填充目录结构。我至少会测试这些情况:

包含通过过滤器的文件的单个文件夹。
包含未通过过滤器的文件的单个文件夹。
一个嵌套文件夹,每个文件夹中都有一个文件。

代码:

class FolderScan implements Runnable {

    private String path;
    private BlockingQueue<File> queue;
    private CountDownLatch latch;
    private File endOfWorkFile;
    private List<Checker> checkers;

    FolderScan(String path, BlockingQueue<File> queue, CountDownLatch latch,
            File endOfWorkFile) {
        this.path = path;
        this.queue = queue;
        this.latch = latch;
        this.endOfWorkFile = endOfWorkFile;
        checkers = new ArrayList<Checker>(Arrays.asList(new ExtentionsCheker(),
                new ProbeContentTypeCheker(), new CharsetDetector()));
    }

    public FolderScan() {
    }

    @Override
    public void run() {
        findFiles(path);
        queue.add(endOfWorkFile);
        latch.countDown();
    }

    private void findFiles(String path) {
        boolean checksPassed = true;
        File root;

        try {
            root = new File(path);
            File[] list = root.listFiles();
            for (File currentFile : list) {
                if (currentFile.isDirectory()) {
                    findFiles(currentFile.getAbsolutePath());
                } else {
                    for (Checker currentChecker : checkers) {
                        if (!currentChecker.check(currentFile)) {
                            checksPassed = false;
                            break;
                        }
                    }

                    if (checksPassed)
                        queue.put(currentFile);
                }
            }
        } catch (InterruptedException | RuntimeException e) {
            System.out.println("Wrong input !!!");
            e.printStackTrace();
        }
    }
}

问题:

  • 如何在每个文件夹中创建文件?
  • 证明队列包含 您期望的 File 对象?
  • 队列中的最后一个元素是 “触发”文件?

最佳答案

How to create files into each folder?

  • 提取文件 IO 并使用模拟存储库进行测试。这意味着您将在其他地方拥有 IO,并且可能希望使用下面的内容来测试它。
  • 使用 JUnit rule 的临时文件夹使用测试文件夹,您可以创建与测试相匹配的文件。

To prove that queue contains the File objects that you expect?

我相信 .equals 对于 File 对象效果很好。

A single folder with a file that does NOT pass the filter.

我会传入拦截器,这样我就可以传入“始终通过”和“始终失败”拦截器。

public class TestFolderScan {
        @Rule
        public TemporaryFolder folder= new TemporaryFolder();

        @Test
        public void whenASingleFolderWithAFileThatPassesTheFilterThenItExistsInTheQueue() {
                File expectedFile = folder.newFile("file.txt");
                File endOfWorkFile = new File("EOW");
                Queue queue = ...;
                FolderScan subject = new FolderScan(folder.getRoot(), queue, new AllwaysPassesBlocker(),...);

                subject.run();

                expected = new Queue(expectedFile, endOfWorkFile);
                assertEquals(queue, expected);
        }
}

关于java - JUnit测试扫描文件夹类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15199786/

相关文章:

java - JUnit + DbUnit : Switch database connection between development and testing environments

java - 使用 JUnit 和 Jersey Client 测试 JAX-RS 应用程序

java - 想要一个 JUnitMatchers AssertThat 来测试包含 3 个或更多子字符串的字符串(当前使用 assertThat ... ... 和 ...)

java - 在构造函数中传递 java.lang.Integer 的参数时出现 NoSuchMethodException(反射)

java - 需要帮助在 java 中打包可执行文件 .jar

ruby - 为什么 Cucumber 被认为是集成测试工具而不是单元测试工具?

Java Mockito : Cannot doReturn child classes?

java - 使用 AssertJ 断言列表中的单个对象

java - glassfish 服务器如何在没有 servlet 映射的情况下提供静态资源

java - 带有德语字母表的 Html 到 Pdf