имитировать переменные в попытке с блоком ресурсов, чтобы выбросить IOException с использованием mockito - PullRequest
0 голосов
/ 03 августа 2020

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

private byte[] convertDataToCSV() {

     try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                        OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
                        CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT
                              .withHeader(CSVHeaders.class))) {
                            
                           printer.printRecord();
                           writer.flush();
                           byte[] bytes = outputStream.toByteArray();
                           return bytes;
            
            }catch(IOException e){
                       //catch exception
            }
}

Здесь я хочу имитировать OutputStreamWriter или CSVPrinter, чтобы Я могу выбросить IOException, когда он вызывает метод printRecord () или flu sh (). Но похоже, что он не использует макет.

OutputStreamWriter writer = mock(OutputStreamWriter.class)
CSVPrinter printer = mock(CSVPrinter.class)

doThrow(new IOException()).when(printer).printRecord() //didn't work
doThrow(new IOException()).when(writer).flush()//didn't work

Есть ли способ использовать фиктивные переменные вместо использования собственных объектов в блоке try с ресурсами с использованием mockito?

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Переменные локальной области видимости, такие как new OutputStreamWriter(new ByteArrayOutputStream()), не могут быть легко смоделированы с помощью mockito.

Вы можете сделать это с помощью PowerMockickto , но PowerMockito по-прежнему не поддерживает JUnit5.

import static org.powermock.api.mockito.PowerMockito.whenNew;

 // ...
OutputStreamWriter writter = mock(OutputStreamWriter .class);
doThrow(new IOException()).when(printer).printRecord();
whenNew(OutputStreamWriter.class).withArguments(any()).thenReturn(writter);

Итак, вы либо пишете тест с помощью PowerMockito и JUnit4, либо реорганизуете свой код с помощью какой-то фабрики для StreamWritter и имитируете этот фабричный метод.

0 голосов
/ 03 августа 2020

Я думаю, вам нужно попробовать что-то ниже, основанное на вашей сигнатуре метода

Mockito.when(myService.getWritter(Mockito.any()))
                .thenThrow(new IOException());

замените myService на ваш фиктивный компонент службы и getWritter на ваш фактический метод

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