Tôi có DynamoDBDao đơn giản sau đây có chứa một phương thức truy vấn một chỉ mục và trả về một bản đồ kết quả.Mockito: Mocking package private classes
import com.amazonaws.services.dynamodbv2.document.*;
public class DynamoDBDao implements Dao{
private Table table;
private Index regionIndex;
public DynamoDBDao(Table table) {
this.table = table;
}
@PostConstruct
void initialize(){
this.regionIndex = table.getIndex(GSI_REGION_INDEX);
}
@Override
public Map<String, Long> read(String region) {
ItemCollection<QueryOutcome> items = regionIndex.query(ATTR_REGION, region);
Map<String, Long> results = new HashMap<>();
for (Item item : items) {
String key = item.getString(PRIMARY_KEY);
long value = item.getLong(ATTR_VALUE);
results.put(key, value);
}
return results;
}
}
Tôi đang cố viết một bài kiểm tra đơn vị xác minh rằng khi chỉ mục DynamoDB trả về một ItemCollection thì Dao trả về bản đồ kết quả tương ứng.
public class DynamoDBDaoTest {
private String key1 = "key1";
private String key2 = "key2";
private String key3 = "key3";
private Long value1 = 1l;
private Long value2 = 2l;
private Long value3 = 3l;
@InjectMocks
private DynamoDBDao dynamoDBDao;
@Mock
private Table table;
@Mock
private Index regionIndex;
@Mock
ItemCollection<QueryOutcome> items;
@Mock
Iterator iterator;
@Mock
private Item item1;
@Mock
private Item item2;
@Mock
private Item item3;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(table.getIndex(DaoDynamo.GSI_REGION_INDEX)).thenReturn(regionIndex);
dynamoDBDao.initialize();
when(item1.getString(anyString())).thenReturn(key1);
when(item1.getLong(anyString())).thenReturn(value1);
when(item2.getString(anyString())).thenReturn(key2);
when(item2.getLong(anyString())).thenReturn(value2);
when(item3.getString(anyString())).thenReturn(key3);
when(item3.getLong(anyString())).thenReturn(value3);
}
@Test
public void shouldReturnResultsMapWhenQueryReturnsItemCollection(){
when(regionIndex.query(anyString(), anyString())).thenReturn(items);
when(items.iterator()).thenReturn(iterator);
when(iterator.hasNext())
.thenReturn(true)
.thenReturn(true)
.thenReturn(true)
.thenReturn(false);
when(iterator.next())
.thenReturn(item1)
.thenReturn(item2)
.thenReturn(item3);
Map<String, Long> results = soaDynamoDbDao.readAll("region");
assertThat(results.size(), is(3));
assertThat(results.get(key1), is(value1));
assertThat(results.get(key2), is(value2));
assertThat(results.get(key3), is(value3));
}
}
Vấn đề của tôi là items.iterator() không thực sự trả về Iterator nó trả về IteratorSupport là gói riêng tư trong API tài liệu DynamoDB. Điều này có nghĩa là tôi không thể thực sự mô phỏng nó như tôi đã làm ở trên và vì vậy tôi không thể hoàn thành phần còn lại của bài kiểm tra của tôi.
Tôi có thể làm gì trong trường hợp này? Làm thế nào để đơn vị kiểm tra DAO của tôi một cách chính xác cho lớp tư nhân gói khủng khiếp này trong API tài liệu DynamoDB?
chi tiết thi hành như tầm nhìn là một trong những lý do cho sự châm "[không giả loại bạn không sở hữu] (http : //www.davesquared.net/2011/04/dont-mock-types-you-dont-own.html) ". Bạn có thể viết một sự trừu tượng trên bất kỳ đối tượng nào trong số này với một hợp đồng/thực hiện mà bạn kiểm soát, hoặc mã chống lại một giao diện thay thế không? –
Xin chào Jeff, cảm ơn bạn đã bình luận của bạn. Tôi không thấy làm thế nào tôi có thể viết một trừu tượng trên các đối tượng này với một hợp đồng/thực hiện tôi kiểm soát. Tôi đã cạn kiệt bộ công cụ hiện tại bị hạn chế bởi kiến thức và kinh nghiệm của mình. Bạn có thể nhìn thấy một cái gì đó mà tôi hiện không thể? Nếu vậy thì tôi sẽ biết ơn nếu bạn có thể chỉ cho tôi đi đúng hướng. –