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

时间:2018-11-08 10:07:00

标签: java unit-testing mocking mockito powermock

我已经在网上引用了Mocking Objects Created Inside method Under testHow 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值?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

@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())

例如。