未为 ArgumentMatcher 对象填充地图
Map is not getting populated for ArgumentMatcher object
我正在尝试模拟一个外部调用以及一个 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() 理想情况下应该 return 一个映射但是给了我一个空值。
所以假设我必须模拟一个输入包含地图的请求,然后尝试在包含地图作为属性的 inout 对象上实现 ArgumentMatcher,我该怎么做?
为什么不使用 @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
中捕获多个值并检查所有值。
我正在尝试模拟一个外部调用以及一个 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() 理想情况下应该 return 一个映射但是给了我一个空值。
所以假设我必须模拟一个输入包含地图的请求,然后尝试在包含地图作为属性的 inout 对象上实现 ArgumentMatcher,我该怎么做?
为什么不使用 @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
中捕获多个值并检查所有值。