JUnit test scanning folder class

穿精又带淫゛_ 提交于 2019-12-11 06:23:40

问题


I want write several tests, but from a high level each of them should populate a directory structure with some files. I'd test each of these cases at least:

A single folder with a file that passes the filter.
A single folder with a file that does NOT pass the filter.
A nested folder with a file in each.

Code:

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();
        }
    }
}

Questions:

  • How to create files into each folder?
  • To prove that queue contains the File objects that you expect?
  • The last element in queue is the 'trigger' File?

回答1:


How to create files into each folder?

  • Extract the file IO and use a mocked repository for the tests. This means that you will have the IO somewhere else and may wish to use the below to test that.
  • A temp folder using the JUnit rule With a test folder you create the files to match the test.

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

.equals works well for File objects I believe.

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

I'd pass in the blockers so I can pass in an "Always Pass" and "Always Fail" blocker.

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);
        }
}


来源:https://stackoverflow.com/questions/15199786/junit-test-scanning-folder-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!