How to mock an s3ObjectStream

Viewed 666

I have code to test as follows:

@BeforeEach
static void setup() throws IOException {
    Context context = new MockLambdaContext();
    mockAmazonS3Client();
}

@Test
@DisplayName("Testing handleRequest returns complete when middle base64 piece")
public void handleRequestTestMiddlePiece() throws IOException {
    ApplicationHandler applicationHandler = new ApplicationHandler();
    mockAmazonS3Client();

    input.replace("tag","middle");

    assertEquals("complete", applicationHandler.handleRequest(input, context));
}

public static void mockAmazonS3Client() throws IOException {
    AmazonS3Client mockAmazonS3Client = mock(AmazonS3Client.class);
    S3Object s3Object = mock(S3Object.class);
    S3ObjectInputStream s3ObjectInputStream = mock(S3ObjectInputStream.class);
    InputStream testInputStream = new ByteArrayInputStream("Test".getBytes());

    when(mockAmazonS3Client.getObject(any(String.class), any(String.class))).thenAnswer(invocationOnMock -> {
        return s3Object;
    });

    when(s3ObjectInputStream.read(any(byte[].class))).thenAnswer(invocation -> {
        return testInputStream.read(invocation.getArgument(0));
    });

    when(s3Object.getObjectContent()).thenReturn(s3ObjectInputStream);

    new MockUp<AmazonS3Client>() {
        @Mock

        public S3Object getObject(String bucketName, String key) throws SdkClientException, AmazonServiceException {
            return s3Object;
        }
    };

    new MockUp<AmazonS3Client>() {
        @Mock

        PutObjectResult putObject(PutObjectRequest var1) throws SdkClientException, AmazonServiceException {
            return null;
        }
    };

    new MockUp<AmazonS3Client>() {
        @Mock

        public S3ObjectInputStream getObjectContent() {
            return s3ObjectInputStream;
        }
    };
}

In the mockAmazonS3Client I have mocked the S3Object and the S3ObjectStream that getObject produces using mockito. I have managed to use a 'when' to have getObjectContent call an S3ObjectStream. However, when I use another 'when' to mock what happens if the S3ObjectSteam is read it throws an exception where 0 bytes are returned:

java.io.IOException: Underlying input stream returned zero bytes

It could be the second 'when' that is failing for some reason, though I'm not sure. Any thoughts will be gratefully received. Thanks.

0 Answers
Related