下面是我要模拟的代码,
this.dynamoDb.getTable(PropertyUtil.get(Constants.SOME_TABLE_NAME))
.putItem(
new PutItemSpec()
.withItem(new Item().withString("ID", pId).withString("eId", pEId)
.withString("activeInd", pActiveInd)));
我尝试过的是下面的
mockStatic(AmazonDynamoDBClientBuilder.class);
when(AmazonDynamoDBClientBuilder.defaultClient()).thenReturn(Mockito.mock(AmazonDynamoDB.class));
PowerMockito.mockStatic(PropertyUtil.class);
when(PropertyUtil.get(Constants.Some__ID_MAPPING_TABLE_NAME)).thenReturn("SOME_TABLE_NAME");
Table vTable = mock(Table.class);
PutItemSpec vPutItemSpec = mock(PutItemSpec.class);
PutItemResult vPutItemResult = new PutItemResult();
PowerMockito.whenNew(PutItemSpec.class).withAnyArguments().thenReturn(vPutItemSpec);
PowerMockito.when(vTable.putItem(vPutItemSpec)).thenReturn(vPutItemOutcome);
下面是我得到的错误,
java.lang.IllegalArgumentException: null
at com.amazonaws.services.dynamodbv2.document.PutItemOutcome.<init>(PutItemOutcome.java:33) ~[aws-java-sdk-dynamodb-1.11.400.jar:?]
at com.amazonaws.services.dynamodbv2.document.internal.PutItemImpl.doPutItem(PutItemImpl.java:86) ~[aws-java-sdk-dynamodb-1.11.400.jar:?]
at com.amazonaws.services.dynamodbv2.document.internal.PutItemImpl.putItem(PutItemImpl.java:63) ~[aws-java-sdk-dynamodb-1.11.400.jar:?]
at com.amazonaws.services.dynamodbv2.document.Table.putItem(Table.java:168) ~[aws-java-sdk-dynamodb-1.11.400.jar:?]
请提出建议,我需要解决的问题,我是Mock和JUnit的新手。 预先感谢。
答案 0 :(得分:0)
使用DynamoDBMapper可以使您的生活更加轻松。这是来自AWS的对象映射SDK。这意味着您将创建要在代码中处理的Plain Old Java Object,并只需在类中添加注释,然后将这些对象映射到DynamoDB。
好处是代码更加简洁,并且使对象变得易于模拟。
在您的情况下,此代码:
this.dynamoDb.getTable(PropertyUtil.get(Constants.SOME_TABLE_NAME))
.putItem(
new PutItemSpec()
.withItem(new Item().withString("ID", pId).withString("eId", pEId)
.withString("activeInd", pActiveInd)));
将成为:
SOME_TABLE_NAME thing = new SOME_TABLE_NAME().id(pId).eId(pEid).activeInd(pActiveInd);
Mapper.save(thing);
或类似。如您所见,更清洁。
答案 1 :(得分:0)
this.dynamoDb
.getTable(PropertyUtil.get(Constants.SOME_TABLE_NAME))
.putItem(new PutItemSpec()
.withItem(new Item().withString("ID", pId).withString("eId", pEId)
.withString("activeInd", pActiveInd)));
为什么不这样做。
AmazonDynamoDB dynamoDb = Mockito.mock(AmazonDynamoDB.class);
Table mockTable = Mockito.mock(Table.class)
PutItemOutcome itemOutcome = Mockito.mock(PutItemOutcome.class)
Mockito.when(mockTable.putItem(Mockito.any(PutItemSpec.class)).thenReturn(itemOutcome);
Mockito.when(dynamoDb.getTable(Mockito.any(Property.class)).thenReturn(mockTable);
我认为您不需要手动模拟PutItemSpec。另一个选择就是使用
Mockito.when(mockTable.putItem(Mockito.any(PutItemSpec.class)). thenCallRealMethod();
答案 2 :(得分:0)
使用:
-Mockito
-Junit
在我的情况下,我必须在Junit
中声明带有注释Table
的参数类型@Mock
(导入com.amazonaws.services.dynamodbv2.document.Table)
然后在我的@Test
中,我必须使用Mockito.when()
进行模拟返回,这里是我的示例代码:
public class ClassName {
@Mock private Table tableMock;
@Test
public void shouldMockTableInfoForDynamoBDTable() {
Mockito.when(tableMock.getItem((GetItemSpec) any()))
.thenReturn(
Item.fromJSON(
"json: example"));
subject.myMethodUnderTest();
}
}