2015-07-13 58 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)); 
}