簡體   English   中英

模擬在測試方法中創建的返回值(它是一個對象)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM