Как протестировать Java-методы, которые работают с Excel, с помощью JUnit - PullRequest
0 голосов
/ 02 января 2019

У меня есть методы в Java для работы с Excel, которые я пытаюсь выполнить модульное тестирование.Я пробовал кое-что тут и там, но у меня ничего не получается.

У меня есть следующие методы:

@RequestMapping(method = POST, produces = "application/vnd.ms-excel")
@ResponseBody
public ResponseEntity<byte[]> createExcel(@RequestBody List<ExcelDto> excelDtos) {
    log.log(Level.INFO, "generate excel started");
    try (InputStream is = GenerateExcelController.class.getResourceAsStream(PATH_TO_TEMPLATE)) {
        this.temp = File.createTempFile("tempfile", ".xlsx");
        try (FileOutputStream fs = new FileOutputStream(temp)) {
            processExcel(excelDtos, is, fs);
            return generateResponse();
        }
    } catch (Exception e) {
        log.log(Level.SEVERE, "Cannot generate excel!", e);
    }
    return null;
}

private void processExcel(List<ExcelDto> productDto, InputStream is, FileOutputStream fs) throws IOException{
    Context context = new Context();
    context.putVar("products", productDto);
    context.putVar("today", LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));
    JxlsHelper.getInstance().processTemplate(is, fs, context);
}

private ResponseEntity<byte[]> generateResponse() {
    try (FileInputStream fileInputStream = new FileInputStream(temp.getPath())) {
        Resource resource = new InputStreamResource(fileInputStream);
        byte[] content = FileCopyUtils.copyToByteArray(resource.getInputStream());
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("application/vnd.ms-excel"));
        log.log(Level.INFO, "Download sample .xlsx request completed");
        Files.delete(temp.toPath());
        return new ResponseEntity<>(content, headers, HttpStatus.OK);
    } catch (Exception e) {
        log.log(Level.SEVERE, "Cannot find temp excel file!", e);
    }
    return null;
}

Может кто-нибудь мне помочь или сказать, как начать?

1 Ответ

0 голосов
/ 02 января 2019

@Controller бины являются синглетонами, поэтому вы должны избегать использования переменных переменных экземпляра, например хранение временного пути к файлу в this.temp. this.temp не относится к области запросов, ваш текущий подход не будет работать, когда есть несколько одновременных запросов POST.

Логика создания Excel, вероятно, должна быть извлечена в новый компонент @Service, который можно тестировать модульно с помощью предварительно определенных ресурсов тестирования.

@Service
public class ExcelService {

  public OutputStream createExcel(InputStream template, List<ExcelDto> products) {
    // read InputStream
    // process template with JxlsHelper
    // return generated Excel as OutputStream
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...