У меня AWS Lambda реализована в Java. Лямбда генерирует файл, а затем записывает его в вывод, используя кодировщик Base64. Я пытаюсь написать для него модульный тест, но он входит в бесконечный цикл при записи файла.

То, что я хотел бы сделать, это захватить то, что записано в encodedStream в модульном тесте, записать его во временную папку, а затем сравнить содержимое с ожидаемым содержимым, но тест зависает до тех пор, пока в конечном итоге не возникнет исключение нехватки памяти ,

Лямбда-код

public class MyLambda implements RequestStreamHandler {

    private static final Logger LOGGER = LogManager.getLogger(MyLambda.class);

    @Override
    public void handleRequest(@Nonnull InputStream inputStream, @Nonnull OutputStream outputStream, @Nonnull Context context) {

        try (OutputStream encodedStream = Base64.getEncoder().wrap(outputStream);){

            encodedStream.write("This is written to file".getBytes());

        } catch (IOException e) {

            LOGGER.info("IOException occurred ", e);

        }

     }

}

Модульный тест

public class MyLambdaTest {

    @Rule
    public TemporaryFolder temporaryFolder = new TemporaryFolder();

    @Test
    public void testRequest() throws IOException {

        MyLambda myLambda = new MyLambda();
        InputStream inputStream = mock(InputStream.class);
        OutputStream mockOutputStream = mock(OutputStream.class);
        Context mockContext = mock(Context.class);

        doNothing().when(mockOutputStream).write(anyInt());
        doNothing().when(mockOutputStream).write(any(byte[].class));
        doNothing().when(mockOutputStream).write(any(byte[].class), anyInt(), anyInt());

        myLambda.handleRequest(inputStream, mockOutputStream, mockContext);

        FileUtils.writeByteArrayToFile(temporaryFolder.newFile(), <captured bytes>);

    }

}

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

0
Joseph McCarthy 17 Авг 2019 в 03:17

2 ответа

Лучший ответ

Вместо того, чтобы издеваться над OutputStream, вы можете создать ByteArrayOutputStream. В основном это просто массив байтов, который реализует OutputStream. И затем вы можете проверить правильность содержимого, написанного с помощью ByteArrayOutputSteam#toBytes() или ByteArrayOutputStream#toString()

2
user239512 17 Авг 2019 в 13:10
FileOutputStream fout =
        new FileOutputStream(temporaryFolder.newFile("testout.txt"));

MyLambda myLambda = new MyLambda();

myLambda.handleRequest(null, fout, null);

fout.close();    

Привет джозеф,

Пожалуйста, найдите мою попытку выше. Я использовал настоящий FileOutputStream.

0
Andrew NS Yeow 17 Авг 2019 в 02:14