我有一个泛型类,它维护一个内部数组(比方说数据)和数组中的元素数(比如N)(两者都是私有的)。我可以向数组添加元素,这将更新N的值。该类的公共API没有数据数组的获取方法或N.Still我想编写用于检查数组状态和N的单元测试。
public class InternalArray<T> {
private T[] data;
private int N;
private int head;
public InternalArray() {
super();
data = (T[]) new Object[10];
N = 0;
head = 0;
}
public void add(T item){
data[head]=item;
head++;
N++;
}
public T get(){
T item = data[--head];
N--;
return item;
}
}
在这里,我可以测试的是公共API ..但我需要测试私有变量的内部状态。我以为我可以使用反射来访问这些字段。我尝试了下面的代码,我可以得到N的值。当谈到T []数据时,我无法弄清楚如何转换结果{{1转到Object
(来自电话String[]
)
arrayf.get(inst)
这给出了
以下的输出public static void demoReflect(){
try {
Class t = Class.forName("InternalArray");
System.out.println("got class="+t.getName());
InternalArray<String> inst = (InternalArray<String>) t.newInstance();
System.out.println("got instance="+inst.toString());
inst.add("A");
inst.add("B");
Field arrayf = t.getDeclaredField("data");
arrayf.setAccessible(true);
Field nf = t.getDeclaredField("N");
nf.setAccessible(true);
System.out.println("got arrayfield="+arrayf.getName());
System.out.println("got int field="+nf.getName());
int nval = nf.getInt(inst);
System.out.println("value of N="+nval);
Object exp = arrayf.get(inst);
//how to convert this to String[] to compare if this is {"A","B"}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
Object
调用得到的arrayf.get(inst)
类型为Object[]
,而不是String[]
,因为Java泛型是通过type erasure实现的。你可以这样做:
Object[] strings = (Object[])arrayf.get(inst);
System.out.println(strings.length);
for (int i = 0 ; i != strings.length ; i++) {
String s = (String)strings[i];
...
}
P.S。我将远离关于是否对单元测试实现的私有细节进行单元测试的讨论。