Пересмотрите возвращаемое значение (которое является объектом), созданное внутри метода теста - PullRequest
0 голосов
/ 08 ноября 2018

Я отослал ответы на Mocking Объекты, созданные внутри метода Тестируемый , Как смоделировать объекты, созданные внутри метода? и другие вопросы в сети, но не могу понять, почему мое решение не работает. Мой метод тестирования:

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), все еще равно нулю.

Как мне получить значение listMock?

Спасибо.

1 Ответ

0 голосов
/ 08 ноября 2018

Прежде всего, вы слишком усложняете вещи, так как вы уже используете аннотацию:

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

например.

...