2015-07-13 59 views
1

我正在爲我的測試用例編寫aeropsike junit測試用例。爲了存儲aerospike箱,我正在使用ConcurrentHashMap。Aerospike JUNIT記錄構造函數不起作用

// InMemory Map for storing AeroSpike Related Data... 
ConcurrentMap<String, Bin[]> aerospike_keyBins = new ConcurrentHashMap<String, Bin[]>(); 

// InMemory Map for storing AeroSpike Related Data... 
ConcurrentMap<String, Integer> aerospike_keyGen = new ConcurrentHashMap<String, Integer>(); 

存儲箱和GenNumber相關信息工作得很好。

但我面臨的問題,同時從地圖獲取記錄(實際上將bin的值從Map轉換爲Aerospike Record)。

這裏是預計將其轉換的功能。

private Record binsToRecord(String stringKey, Bin... bins) { 
    Map<String, Object> mapOfBins = new HashMap<String, Object>(); 
    for (Bin bin : bins) { 
     mapOfBins.put(bin.name, bin.value); 
    } 
    return new Record(mapOfBins, aerospike_keyGen.get(stringKey), 1); 
} 

雖然在該函數中調用new Record我收到以下錯誤消息。

java.lang.ClassCastException: com.aerospike.client.Value$StringValue cannot be cast to java.lang.String 
    at com.aerospike.client.Record.getString(Record.java:66) 

在調試這個問題,我發現,在塞式的Record.class, 以下功能給錯誤。

/** 
* Get bin value as String. 
*/ 
public String getString(String name) { 
    return (String) getValue(name); 
} 

getValue將返回正確的值,但(String) getValue(name)拋出錯誤。

任何線索,爲什麼我得到這個錯誤?

回答

1

您的binsToRecord方法看起來不錯。

/** 
* Get bin value as String. 
*/ 
public String getString(String name) { 
    return (String) getValue(name); 
} 

這裏在Bin binValue是一個StringValue對象,所以你不能直接將它轉換爲String。 嘗試

(getValue(name)).toString() 
// StringValue object provide toString() method. 
+0

謝謝sudhanshu。我得到了代碼中的實際問題。 –

0

其實,問題是,而把價值當地HashMap中。 我在本地哈希映射中推送StringValues類型的值修正了將標準字符串解決問題的問題。

這裏是新的binsToRecordfunction。

/* 
* Convert Bin Set to Record Object. 
*/ 
private Record binsToRecord(String stringKey, Bin... bins) { 
    Map<String, Object> mapOfBins = new HashMap<String, Object>(); 
    for (Bin bin : bins) { 
     if (bin.value instanceof Value.StringValue) 
      mapOfBins.put(bin.name, bin.value.toString()); 
     else if (bin.value instanceof Value.LongValue) 
      mapOfBins.put(bin.name, bin.value.toLong()); 
     else if (bin.value instanceof Value.DoubleValue) 
      mapOfBins.put(bin.name, bin.value.toLong()); 

    } 
    return (new Record(mapOfBins, aerospike_keyGen.get(stringKey), 1)); 
}