mockito 模拟s3Service + junit时出现空指针异常

gijlo24d  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(176)

我正在使用amazons3进行文档存储。我需要为使用s3的服务类编写测试用例。
如何模拟s3对象?
我试过下面的,但得到的是NPE。
示例测试用例:

@ExtendWith(MockitoExtension.class)
class MyServiceTest {

    @InjectMocks
    private MyService myService;

    @InjectMocks
    private S3Service s3Service;
    @Mock
    private S3Configuration.S3Storage s3Storage;
    @Mock
    private AmazonS3 amazonS3;

    @BeforeEach
    public void setup() {
        ReflectionTestUtils.setField(myService, "s3Service", s3Service);
        ReflectionTestUtils.setField(s3Service, "s3Storage", s3Storage);
    }

 @Test
    void getDetailTest() {

        given(s3Storage.getClient()).willReturn(amazonS3);
        given(s3Service.getBucket()).willReturn("BUCKET1");
        given(s3Service.readFromS3(s3Service.getBucket(),"myfile1.txt")).willReturn("hello from s3 file"); //Null pointer exception
}
}

下面是抛出NPE的s3服务类示例。

public String readFromS3(String bucketName, String key) {
        var s3object = s3Storage.getClient().getObject(new GetObjectRequest(bucketName, key));
//s3Object is getting null when run the test case.
    //more logic

}

如何从MyService类模拟s3Service.readFromS3()

twh00eeo

twh00eeo1#

您不需要在测试中模拟每个对象,使用模拟来构造服务是很好的...

@ExtendWith(MockitoExtension.class)
class MyServiceTest {

    private MyService myService;

    @Mock
    private AmazonS3 amazonS3;

    @BeforeEach
    public void setup() {
        this.myService = new MyService(amazonS3);
    }

    @Test
    void getDetailTest() {
        given(this.amazonS3.getXXX()).willReturn(new Yyyyy());
        assertEqual("ok", this.myService.doSmth());
    }
}

相关问题