在Amazons中使用Junit和Mockito进行GetObject方法的单位测试3

发布于 2025-01-29 11:02:44 字数 1829 浏览 2 评论 0原文

我有使用s3.GetObject获取S3Object的方法,并将对象的内容写入临时文件中,

@Override
    public Optional<String> getObject(String s3BucketName, String s3Path) {
        try {
            S3Object s3Object = s3Client.getObject(new GetObjectRequest(s3BucketName, s3Path));
            try (S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent()){
                File tmp = File.createTempFile("/tmp/" + UUID.randomUUID().toString(), ".json");
                IOUtils.copy(s3ObjectInputStream, new FileOutputStream(tmp));
                return Optional.of(tmp.getAbsolutePath());
            } catch (Exception e) {
                System.err.println(e.getMessage());
            }
        } catch (AmazonServiceException e) {
            String msg = String.format("Service error while getting object=%s in bucket=%s",
                    s3Path, s3BucketName);
            throw new RuntimeException(msg, e);
        } catch (SdkClientException e) {
            String msg = String.format("Client error while getting object=%s in bucket=%s",
                    s3Path, s3BucketName);
            throw new RuntimeException(msg + e.getMessage());
        }
        return Optional.empty();
    }

我不确定我知道如何为此方法编写单元测试。这是我尝试过的方法,

@Test
    public void getObjectTest() throws UnsupportedEncodingException {
        S3Object s3Object = Mockito.mock(S3Object.class);
        s3Object.setObjectContent(new StringInputStream(TEST_STRING));
        Mockito.when(mockS3Client.getObject(new GetObjectRequest(TEST_S3BUCKET, TEST_S3OBJECT))).thenReturn(s3Object);
        s3Accessor.getObject(TEST_S3BUCKET, TEST_S3OBJECT);
        verify(mockS3Client).getObject(new GetObjectRequest(TEST_S3BUCKET, TEST_S3OBJECT));
    }

我是对单元测试的新手,我不确定我可以在这里断言什么,因为我只从该方法中获得了文件的绝对路径。 有人可以建议我吗?

I have method which uses s3.getObject to get S3Object and writes the contents of the object into a temporary file

@Override
    public Optional<String> getObject(String s3BucketName, String s3Path) {
        try {
            S3Object s3Object = s3Client.getObject(new GetObjectRequest(s3BucketName, s3Path));
            try (S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent()){
                File tmp = File.createTempFile("/tmp/" + UUID.randomUUID().toString(), ".json");
                IOUtils.copy(s3ObjectInputStream, new FileOutputStream(tmp));
                return Optional.of(tmp.getAbsolutePath());
            } catch (Exception e) {
                System.err.println(e.getMessage());
            }
        } catch (AmazonServiceException e) {
            String msg = String.format("Service error while getting object=%s in bucket=%s",
                    s3Path, s3BucketName);
            throw new RuntimeException(msg, e);
        } catch (SdkClientException e) {
            String msg = String.format("Client error while getting object=%s in bucket=%s",
                    s3Path, s3BucketName);
            throw new RuntimeException(msg + e.getMessage());
        }
        return Optional.empty();
    }

I'm not sure I understand how to write the unit test for this method. Here is what I have tried

@Test
    public void getObjectTest() throws UnsupportedEncodingException {
        S3Object s3Object = Mockito.mock(S3Object.class);
        s3Object.setObjectContent(new StringInputStream(TEST_STRING));
        Mockito.when(mockS3Client.getObject(new GetObjectRequest(TEST_S3BUCKET, TEST_S3OBJECT))).thenReturn(s3Object);
        s3Accessor.getObject(TEST_S3BUCKET, TEST_S3OBJECT);
        verify(mockS3Client).getObject(new GetObjectRequest(TEST_S3BUCKET, TEST_S3OBJECT));
    }

I'm new to unit tests and I'm not sure what I can assert here since I'm getting only an absolute path of the file from the method.
Can someone advice me on this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白日梦 2025-02-05 11:02:46

我建议在测试中有一些建议
请勿模拟s3Object而不是从本地文件构建对象,将值设置为模拟对象不正确。

您也应该为例外添加测试。

查看以下代码

import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class ExampleServiceTest {

    @Mock
    private AmazonS3Client mockS3Client;

    @Test
    public void getObjectTest() throws UnsupportedEncodingException, FileNotFoundException {
        String testBucketName = "test_bucket", s3Path = "/files/A.json";
        S3Object s3Object = buildS3Object();
        when(mockS3Client.getObject(new GetObjectRequest(testBucketName, s3Path))).thenReturn(s3Object);
        ExampleService exampleService = new ExampleService(mockS3Client);

        exampleService.getObject(testBucketName, s3Path);

        verify(mockS3Client).getObject(new GetObjectRequest(testBucketName, s3Path));
    }


    @Test
    public void ShouldThrowRuntimeExceptionServiceErrorMessageWhenAmazonServiceException() throws FileNotFoundException {
        String testBucketName = "test_bucket", s3Path = "/files/A.json";

        when(mockS3Client.getObject(new GetObjectRequest(testBucketName, s3Path))).thenThrow(AmazonServiceException.class);
        ExampleService exampleService = new ExampleService(mockS3Client);

        Exception exception = assertThrows(RuntimeException.class, () -> {
            exampleService.getObject(testBucketName, s3Path);
        });

        assertEquals("Service error while getting object=/files/A.json in bucket=test_bucket", exception.getMessage());
    }

    private S3Object buildS3Object() throws FileNotFoundException {
        S3Object s3Object = new S3Object();
        s3Object.setObjectContent(new FileInputStream("your_path/src/test/resources/A.json"));
        return s3Object;
    }
}

There are a few things I would suggest changing in the test
Do not mock the S3Object rather build the object from a local file, setting the value to the mocked object isn't correct.

You should add tests for exceptions as well.

Check out the below code

import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class ExampleServiceTest {

    @Mock
    private AmazonS3Client mockS3Client;

    @Test
    public void getObjectTest() throws UnsupportedEncodingException, FileNotFoundException {
        String testBucketName = "test_bucket", s3Path = "/files/A.json";
        S3Object s3Object = buildS3Object();
        when(mockS3Client.getObject(new GetObjectRequest(testBucketName, s3Path))).thenReturn(s3Object);
        ExampleService exampleService = new ExampleService(mockS3Client);

        exampleService.getObject(testBucketName, s3Path);

        verify(mockS3Client).getObject(new GetObjectRequest(testBucketName, s3Path));
    }


    @Test
    public void ShouldThrowRuntimeExceptionServiceErrorMessageWhenAmazonServiceException() throws FileNotFoundException {
        String testBucketName = "test_bucket", s3Path = "/files/A.json";

        when(mockS3Client.getObject(new GetObjectRequest(testBucketName, s3Path))).thenThrow(AmazonServiceException.class);
        ExampleService exampleService = new ExampleService(mockS3Client);

        Exception exception = assertThrows(RuntimeException.class, () -> {
            exampleService.getObject(testBucketName, s3Path);
        });

        assertEquals("Service error while getting object=/files/A.json in bucket=test_bucket", exception.getMessage());
    }

    private S3Object buildS3Object() throws FileNotFoundException {
        S3Object s3Object = new S3Object();
        s3Object.setObjectContent(new FileInputStream("your_path/src/test/resources/A.json"));
        return s3Object;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文