Получение файла из текущего пакета - PullRequest
1 голос
/ 25 октября 2011

Этот код хорошо работает на моем локальном компьютере, но дает исключение для файла, когда мы строим с использованием бамбука. Любая идея / обходной путь?

final static String FILE_NAME ="/src/test/java/com/statement/SamplePDFStatementFile.txt";
file = new File(FILE_NAME);
FileInputStream fis = new FileInputStream(file);

Я хочу протестировать класс, который читает файл. Вот полный код.

//Main Class
public class PdfRenderer {

    public void render(PdfFile pdfFile) throws IOException {
        FileInputStream fis = new FileInputStream(pdfFile.getFile());

        final HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
        response.setHeader("Content-Disposition", " attachment; filename=" + pdfFile.getAttachmentName());

        byte[] buff = new byte[2048];
        int bytesRead;
        while (-1 != (bytesRead = fis.read(buff, 0, buff.length))) {
            response.getOutputStream().write(buff, 0, bytesRead);
        }

        response.getOutputStream().flush();

    }
}

//Test

public class PdfRendererTest{

    PdfFile pdfFile;
    File file;

    @Test
    public void test_DetailStatementsByAccountNumber() throws Exception {
        new AbstractSeamTest.ComponentTest() {

            PdfRenderer actionBean = new PdfRenderer();

            URL url = this.getClass().getResource("/SamplePDFStatementFile.txt");
            final String FILE_NAME = url.getFile();

            protected void testComponents() throws Exception {

                file = new File(FILE_NAME);

                context.checking(new Expectations() {{
                    one(pdfFile).getFile();
                    will(returnValue(file));
                    one(pdfFile).getAttachmentName();
                    will(returnValue(file.getName()));
                }});

                actionBean.render(pdfFile);
            }

        }.run();
    }
}

Я хочу установить ожидание того, что pdfFile.getFile () вернет SamplePDFStatementFile.txt. Если я использую getResourceAsStream, я не уверен, как преобразовать его в объект File.

ОК .. теперь я использую. Похоже, вот и ответ:)

public void inputStreamToFile() throws Exception{
                InputStream inputStream =  this.getClass().getResourceAsStream("/SamplePDFStatementFile.txt");

                file = File.createTempFile("abc","def");
                OutputStream out = new FileOutputStream(file);

                int length = 0;
                byte[] bytes = new byte[1024];

                while ((length = inputStream.read(bytes)) != -1) {
                       out.write(bytes, 0, length);
                }

                inputStream.close();
                out.flush();
                out.close();
            }

1 Ответ

5 голосов
/ 25 октября 2011

Нет надежных способов ссылки на файлы, относящиеся к корневой папке проекта.

Вместо этого вам нужно ссылаться на этот файл как на ресурс.Насколько я вижу, вы используете Maven.Если это так, вам нужно поместить этот файл в /src/test/resources, а не /src/test/java (возможно, вы также можете настроить Maven для получения ресурсов из /src/test/java, но это будет нарушением соглашения о расположении каталогов Maven).

После этого вы можете загрузить этот файл как

InputStream fis = getClass()
    .getResourceAsStream("/com/statement/SamplePDFStatementFile.txt");

Или, если текущий класс находится в пакете com.statement, как

InputStream fis = getClass().getResourceAsStream("SamplePDFStatementFile.txt");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...