2014-03-12 52 views
0

我有一個函數,它調用的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

+0

我想你想使用模擬庫來測試你的代碼。看看[Mockito](http://code.google.com/p/mockito/) – mconlin

+0

感謝您的回覆@mconlin,但我不覺得mockito可以在這種情況下工作,除非我可以創建覆蓋模擬函數然後測試主要功能。我認爲我需要更多的行http://stackoverflow.com/questions/1069152/when-to-use-override-in-java – redrubia

回答

0

如果我明白你正在嘗試做的,我覺得你想是這樣的:

public class JaccardScoreScript { 
    Map<String, ScriptDocValues.Longs> mydocs = new HashMap<>(); 
    private Map<String, ScriptDocValues.Longs> doc() { 
     return mydocs; 
    } 
    protected ScriptDocValues.Longs docFieldLongs(String field) { 
     return doc().get(field); 
    } 
} 

如果要覆蓋docFieldLongs方法,你需要擴展類:

public class MockJaccardScoreScript extends JaccardScoreScript { 
    @Override 
    protected ScriptDocValues.Longs docFieldLongs(String field) { 
     ScriptDocValues.Longs longs = /*construct your test data object here*/; 
     return longs; 
    } 
    public static void main(String[] args) { 
     JaccardScoreScript script = new MockJaccardScoreScript(); 
     System.out.println("docFieldLongs: " + script.docFieldLongs("anything")); 
    } 
} 
+0

是的,這是完全正確的。但它不返回List ,它返回Elasticsearch中的類ScriptDocValues.Longs。使用這個,它說'嘗試使用不兼容的類型返回' – redrubia

+0

我試圖通過使用Long來簡化代碼示例,但是我會編輯它以使用您的特定數據類型。 – climmunk

+0

謝謝,這很好。我遇到的困難是如何創建ScriptDocValues.Longs - >用ES不太容易。 – redrubia