Карта не заполняется для объекта ArgumentMatcher - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь смоделировать внешний вызов вместе с ArgumentMatcher, чтобы сопоставить входные значения с запросом.Но когда я пытаюсь извлечь карту из объекта ArgumentMatcher, он дает мне нулевое значение.

Mockito.when(
                dynamoDbMapper.scanPage(eq(ABC.class), argThat(new ArgumentMatcher<DynamoDBScanExpression>() {

                    @Override
                    public boolean matches(Object argument)
                    {
                        DynamoDBScanExpression scanExp = (DynamoDBScanExpression) argument;
                        Assert.assertEquals("5", scanExp.getLimit());
                        Assert.assertEquals("xyz",scanExp.getFilterExpression());
                        Assert.assertEquals(new HashMap(), scanExp.getExpressionAttributeNames());

                            return true;
                    }

                }))).thenReturn(prepareScanResponse());

Это выражение scanExp.getExpressionAttributeNames () в идеале должно возвращать карту, но дает мне нулевое значение.

Итак, предположим, что мне нужно смоделировать запрос, входные данные которого содержат карту, а затем попытаться реализовать ArgumentMatcher для этого объекта inout, который содержит карту в качестве атрибута, как мне это сделать?

1 Ответ

1 голос
/ 01 апреля 2019

Почему бы не использовать @Captor?Захваты используются для получения параметров записи, передаваемых в методы.Это кажется более чистым способом, чем пытаться неправильно использовать устройство сравнения.

@ExtendWith(MockitoExtension.class)
class MarketplaceHttpConnectorImplTest {
    @Captor
    ArgumentCaptor<DynamoDBScanExpression> scanExpressionCaptor;

    @Mock
    DynamoMapper dynamoDbMapper; // or something like this

    @InjectMocks
    MyClassToTest sut; // System Under Test

    @Test
    public void myTest() {
        // prepare mocks
        when(dynamoDbMapper.scanPage(eq(ABC.class), any(DynamoDBScanExpression.class)).thenReturn(prepareScanResponse());

        // Now call the method to test
        sut.methodToCall();

        // Verify calls
        verify(dynamoDbMapper, times(1)).scanPage(eq(ABC.class), scanExpressionCaptor.capture());
        DynamoDBScanExpression param = scanExpressionCaptor.getValue();

        // now test what was passed to the method.
        assertNotNull(param);
        // .....
    }
}

Кстати: не обращайте внимания на JUnit5.Это также работает в JUnit4.Кроме того, я предположил, что было только одно значение.Вы можете захватить несколько значений в одном @Captor и проверить все значения.

...