मेरे पास निम्न सरल डायनेमो डीबीडाओ है जिसमें एक विधि है जो एक इंडेक्स से पूछताछ करता है और परिणामों का नक्शा देता है।मॉकिटो: मॉकिंग पैकेज निजी कक्षाएं
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;
}
}
मैं एक इकाई परीक्षण जो पुष्टि करता है कि जब DynamoDB सूचकांक एक ItemCollection रिटर्न तो दाव रिटर्न इसी परिणाम नक्शा लिखने की कोशिश कर रहा हूँ।
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));
}
}
मेरे समस्या यह है कि items.iterator() वास्तव में वापस नहीं करता है इटरेटर यह एक IteratorSupport जो DynamoDB दस्तावेज़ एपीआई में एक पैकेज निजी वर्ग है देता है। इसका मतलब यह है कि मैं वास्तव में इसे ऊपर नहीं कर सकता जैसा मैंने ऊपर किया था और इसलिए मैं अपना बाकी परीक्षण पूरा नहीं कर सकता।
इस मामले में मैं क्या कर सकता हूं? मैं डायनामो डीबी दस्तावेज़ एपीआई में इस भयानक पैकेज निजी कक्षा को सही ढंग से मेरे डीएओ का परीक्षण कैसे करूं?
क्रियान्वयन विवरण दिशानिर्देश के लिए कारणों में से एक है "([नहीं नकली प्रकार आपकी नहीं है करते हैं] http : //www.davesquared.net/2011/04/dont-mock-types-you-dont-own.html) "। क्या आप इन ऑब्जेक्ट्स में से किसी एक अनुबंध/कार्यान्वयन के साथ एक इंटरस्ट्रक्शन लिख सकते हैं, या इसके बजाय इंटरफेस के खिलाफ कोड? –
हाय जेफ, आपकी टिप्पणी के लिए धन्यवाद। मैं नहीं देखता कि मैं इन वस्तुओं में एक अनुबंध/कार्यान्वयन के साथ नियंत्रण कैसे कर सकता हूं। मैंने अपने वर्तमान टूलसेट को समाप्त कर दिया है जो मेरे ज्ञान और अनुभव से सीमित है। क्या आप कुछ ऐसा देख सकते हैं जिसे मैं वर्तमान में नहीं कर सकता? यदि ऐसा है तो मैं आभारी रहूंगा यदि आप मुझे सही दिशा में इंगित कर सकते हैं। –