PowerMockito final Статический метод вызывает фактический метод - PullRequest
0 голосов
/ 25 октября 2018

У меня есть такие выражения, как

public void dummyMethod() {    
    CreateTableRequest ctr = dynamoDBMapper.generateCreateTableRequest(RolePolicies.class);
    ctr.setProvisionedThroughput(new ProvisionedThroughput(30L, 5L));
    TableUtils.createTableIfNotExists(amazonDynamoDB, ctr);
}

Я пытаюсь создать для него UT с помощью:

    @PrepareForTest(TableUtils.class)
    @Test
    public void verifyRoleTableOnDynamo() throws Exception
    {
        Mockito.doReturn(new CreateTableRequest()).when(dynamoDBMapper).generateCreateTableRequest(any());
        Mockito.doReturn(new CreateTableResult()).when(amazonDynamoDB).createTable(ctr);

        PowerMockito.mockStatic(TableUtils.class);
        Mockito.when(tableUtils_mock.createTableIfNotExists(mock(AmazonDynamoDB.class),mock(CreateTableRequest.class)))
            .thenReturn(true);  //This line throws Exception
      // PowerMockito.doReturn(true).when(TableUtils.createTableIfNotExists(amazonDynamoDB,ctr));

        testClassObject.dummyMethod();

        //There should be no Exception in this case.
        Assert.assertTrue(true); // Other Assert
    }

Вместо насмешки и возврата значения PowerMockito вызывает фактическую реализацию метода createTableIfNotExists:

Я получаю ошибку:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: не может быть возвращено логическое значение createTable () createTable () должно возвращать CreateTableResult

К вашему сведению: Amazon SDK реализует его как:

public static final boolean createTableIfNotExists(final AmazonDynamoDB dynamo, final CreateTableRequest createTableRequest) {
    try {
        dynamo.createTable(createTableRequest);
        return true;
    } catch (final ResourceInUseException e) {
        //Statements
    }
    return false;
}

1 Ответ

0 голосов
/ 25 октября 2018

@PrepareForTest добавлено на уровне класса, а не метода

@RunWith(PowerMockRunner.class)
@PrepareForTest(TableUtils.class) //<-- Add @PrepareForTest at class level.
public class MyTest {    
    @Test
    public void verifyRoleTableOnDynamo() throws Exception {
        //Arrange
        PowerMockito.mockStatic(TableUtils.class); //<-- Call PowerMockito.mockStatic() to mock a static class

        //Just use Mockito.when() to setup your expectation:
        Mockito.when(TableUtils.createTableIfNotExists(any(AmazonDynamoDB.class), any(CreateTableRequest.class)))
            .thenReturn(true).;

        //Act
        testClassObject.dummyMethod();

        //There should be no Exception in this case.
        Assert.assertTrue(true); // Other Assert
    }
}

Ссылка Статический метод насмешки

...