【问题标题】:Map is not getting populated for ArgumentMatcher object没有为 ArgumentMatcher 对象填充地图
【发布时间】:2019-04-01 12:53:11
【问题描述】:

我正在尝试模拟外部调用以及 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() 理想情况下应该返回一个地图,但给我一个空值。

假设我必须模拟一个输入包含映射的请求,然后尝试在包含映射作为属性的那个 inout 对象上实现 ArgumentMatcher,我该怎么做?

【问题讨论】:

  • 你想完成什么?您是否尝试获取scanPage 方法的参数?如果是这样,为什么不使用.thenAnswer 选项?如果我知道您要做什么,我可以举个例子。
  • 我正在尝试匹配我在 DynamoDB 的 scanPage 函数中作为 DynamoDBScanExpression 传递的请求参数。 DynamoDBScanExpression 包含我在实际代码中的请求中发送的映射参数。现在我想在 ArgumentMatcher 下的这个测试中匹配这个参数。

标签: mockito argument-matcher


【解决方案1】:

为什么不使用@Captor? Captors 用于获取传递给方法的记录参数。这似乎比尝试滥用匹配器更干净。

@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 中捕获多个值并检查所有值。

【讨论】:

  • 只是想问一下,为什么它不能与 ArgumentMatcher 一起使用?为什么从 ArgumentMatcher 的对象中获取的地图为空?
  • 我能想到的唯一原因是scanExp 不包含.getExpressionAttributeNames() 中的地图。如果之前的断言确实有效,那么就没有理由将对象“半”构造。那么测试可能发现了一个错误?
猜你喜欢
  • 1970-01-01
  • 2021-08-03
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多