我有一個函數,它調用的ElasticSearch功能:測試Elasticsearch功能 - 創建一個超越功能
List<Long> docItems = docFieldLongs(docItemField).getValues();
然後做了一些計算和輸出基於docItems.
的問題是,在測試中,我不要創建一個大的模擬彈性搜索節點等。相反,我想創建一個覆蓋這個函數,在測試中被調用。
問題是我該如何做到這一點?應該在測試中調用這個新函數,而不是Elasticsearch函數。我想要做類似下面的事情,但由於Unknown macro
不可用,這不起作用。否則,我可以創建ScriptDocValues.Longs,雖然似乎無法找到如何做到這一點!
@Override
private ScriptDocValues.Longs docFieldLongs(String getter){
List<Long> docFields = new ArrayList<Long>();
docFields.add(new Long(101));
docFields.add(new Long(102));
Unknown macro: return docFields;
}
我的兩個問題如下:
- 如何覆蓋僅用於測試目的的功能?
- 如何模仿docFieldLongs?
編輯 - 注意這不是一個解決方案,只需沿線一個:
我一直在這一段時間,似乎很長篇大論。這裏是一個粗略的方案,到目前爲止:
@Test
public void testRunAsLongs()
{
script = new MaxiScoreScript(params){
@Override
public ScriptDocValues.Longs docFieldLongs(String getter)
{
try{
writer = new IndexWriter(new RAMDirectory(), new IndexWriterConfig(Lucene.VERSION, new StandardAnalyzer(Lucene.VERSION)).setMergePolicy(new LogByteSizeMergePolicy()));
}
catch(IOException e){
}
Document d = new Document();
d.add(new LongField("value", 102, Field.Store.NO));
d.add(new LongField("value" ,101, Field.Store.NO));
try{
writer.addDocument(d);
}
catch(IOException e){
}
IndexNumericFieldData indexFieldData = null;
try {
indexFieldData = IndexFieldDataService.getForField("value");
}
catch(IOException e){
System.out.println("getting field data failed");
}
AtomicNumericFieldData fieldData = null;
try{
fieldData = indexFieldData.load(refreshReader());
}
catch(Exception e)
{
}
return (ScriptDocValues.Longs) fieldData.getScriptValues();
}
}
}
如果您有興趣瞭解的docFieldLongs行爲,你也不妨考慮Longs
我想你想使用模擬庫來測試你的代碼。看看[Mockito](http://code.google.com/p/mockito/) – mconlin
感謝您的回覆@mconlin,但我不覺得mockito可以在這種情況下工作,除非我可以創建覆蓋模擬函數然後測試主要功能。我認爲我需要更多的行http://stackoverflow.com/questions/1069152/when-to-use-override-in-java – redrubia