![](/img/trans.png)
[英]How to mock an object which is created inside a method which is under test only with mockito not with powermockito?
[英]Mock the return value (which is an object) created inside a test method
我已經參考了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);
}
我試過嘲笑ObjectListing listing = 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);
但是,我為ObjectListing listing = s3client.listObjects(bucketNameForJsons)
獲得的值仍然為空。
我如何讓它獲得listingMock的價值?
謝謝。
首先,您使事情過於復雜,因為您已經在使用注釋:
@Mock
private AmazonS3 s3clientMock;
那你應該堅持下去。 含義:使用@RunWith 或 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())
例如。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.