У меня 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, так что я знаю, что он работает, но я хотел бы написать для него подходящий модульный тест для будущих сборок
2 ответа
Вместо того, чтобы издеваться над OutputStream
, вы можете создать ByteArrayOutputStream
. В основном это просто массив байтов, который реализует OutputStream
. И затем вы можете проверить правильность содержимого, написанного с помощью ByteArrayOutputSteam#toBytes()
или ByteArrayOutputStream#toString()
FileOutputStream fout =
new FileOutputStream(temporaryFolder.newFile("testout.txt"));
MyLambda myLambda = new MyLambda();
myLambda.handleRequest(null, fout, null);
fout.close();
Привет джозеф,
Пожалуйста, найдите мою попытку выше. Я использовал настоящий FileOutputStream
.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.