gpt4 book ai didi

java - 模拟在测试方法内创建的返回值(这是一个对象)

转载 作者:行者123 更新时间:2023-11-30 05:55:52 27 4
gpt4 key购买 nike

我已将答案转至 Mocking Objects Created Inside method Under test , How to mock objects created inside method?和网上的其他问题,但无法理解为什么我的解决方案不起作用。我的测试方法是:

private AmazonS3 s3client;    
public int getBucketFileCount(String bucketNameForJsons) {
if (s3client.doesBucketExistV2(bucketNameForJsons)) {
log.info("Bucket name is not available.");
return 0;
}
ObjectListing listing = s3client.listObjects(bucketNameForJsons);
List<S3ObjectSummary> objectListing = listing.getObjectSummaries();
log.info("Counting s3client files");
return objectListing.size();
}

我写的测试用例是:

@Mock
private AmazonS3 s3clientMock;
@Mock
private ObjectListing listingMock;
private final String SAMPLE_BUCKET = "SAMPLE_BUCKET";

@InjectMocks
private Accessor accessor;

@Test
public void testGetBucketFileCount() {
s3clientMock = Mockito.mock(AmazonS3.class);
listingMock = Mockito.mock(ObjectListing.class);
//PowerMockito.when(s3clientMock.listObjects(anyString())).thenReturn(listingMock);
//PowerMockito.doReturn(listingMock).when(s3clientMock).listObjects(anyString());
//PowerMockito.when(s3clientMock.listObjects(Matchers.any(String.class))).thenReturn(listingMock);
List<S3ObjectSummary> objectListing = new ArrayList<>();
S3ObjectSummary objectSummary1 = Mockito.mock(S3ObjectSummary.class);
S3ObjectSummary objectSummary2 = Mockito.mock(S3ObjectSummary.class);
objectListing.add(objectSummary1);
objectListing.add(objectSummary2);
Mockito.doReturn(objectListing).when(listingMock).getObjectSummaries();
int actualSize = accessor.getBucketFileCount(SAMPLE_BUCKET);
//Assert.assertNotEquals(actualSize, EXPECTED_SIZE);
}

我尝试通过以下方式模拟 ObjectListinglisting = s3client.listObjects(bucketNameForJsons);:

  • PowerMockito.when(s3clientMock.listObjects(anyString())).thenReturn(listingMock);

  • PowerMockito.doReturn(listingMock).when(s3clientMock).listObjects(anyString());

  • PowerMockito.when(s3clientMock.listObjects(Matchers.any(String.class))).thenReturn(listingMock);

但是,我从 ObjectListinglisting = s3client.listObjects(bucketNameForJsons) 获得的值仍然为空。

如何让它获取listingMock值?

谢谢。

最佳答案

首先,您使事情变得过于复杂,因为您已经在使用注释:

@Mock
private AmazonS3 s3clientMock;

那么你应该坚持。含义:要么使用 @RunWith or Mockito.initMocks 。但你绝对不应该这样做s3clientMock = Mockito.mock(AmazonS3.class); 再次。 (它不会直接造成伤害,但是当你在这里这样做时会导致奇怪的效果,但在另一种方法中做不同的事情)

那么:你根本不需要在这里使用PowerMock(ito)。您有两个模拟,并且您想要对每个模拟进行控制和方法调用。

很简单:

when(s3clientMock.listObjects(any())).thenReturn(listingMock);
when(listingMock.getObjectSummaries()).thenReturn(someList);

应该做。 someList将是 List<S3ObjectSummary> .

然后你可以去:

assertThat(accessor.getBucketFileCount(SAMPLE_BUCKET), is(someList.size())

例如。

关于java - 模拟在测试方法内创建的返回值(这是一个对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53205459/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com