首页 > 解决方案 > 如何模拟 s3ObjectStream

问题描述

我有代码测试如下:

@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;
        }
    };
}

在 mockAmazonS3Client 中,我模拟了 getObject 使用 mockito 生成的 S3Object 和 S3ObjectStream。我设法使用“何时”让 getObjectContent 调用 S3ObjectStream。但是,当我使用另一个“何时”来模拟读取 S3ObjectSteam 时会发生什么时,它会抛出一个返回 0 字节的异常:

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

尽管我不确定,但由于某种原因,这可能是第二个“何时”失败。任何想法将不胜感激。谢谢。

标签: testingamazon-s3mockingmockitoinputstream

解决方案


推荐阅读