我有一个类如下:
public class SomeClass {
public static AbstractClass<Boolean> variable1 = AbstractClass.create("key", value);
}
AbstractClass
看起来像这样:
public abstract AbstractClass<T> {
private String key;
private T value;
protected AbstractClass(String key, T value) {
this.key = key;
this.value = value;
}
protected abstract void func();
public String getKey() {
return key;
}
public T get() {
return value;
}
public static create(String key, String default) {
return new AbstractClass<String>(key, default) {
@Override
protected void func() {
}
};
}
}
我想在SomeClass
上编写一个测试,它可以访问所有这些变量[1 ...]并对其“密钥”执行测试。我怎么能这样做?
这是我对此的尝试:
for (Field field : allFields) {
Class<?> targetType = field.getType();
AbstractClass<?> flag = (AbstractClass<?>) field.get(targetType.newInstance());
assertTrue(flag.getKey().startsWith("xyz"));
显然,使用newInstance
无效,targetType
这里是抽象的,并抛出InstantiationException
。
另一种方法是静态访问变量variable1,variable2等所有变量,从中检索密钥,并对其执行断言。但是,显然,这意味着如果有人在SomeClass
中添加了一个新字段,则有人必须手动修改测试文件并编写断言。这并没有什么帮助,因为人们可能会忘记编写测试。
所以我认为使用反射可能会解决这个问题。但是,我认为使用反射是不可能的,所以想知道是否有办法解决这个问题? 或者,任何其他的自动化测试,以便测试可以添加所有字段,开发人员不需要担心它?
答案 0 :(得分:1)
您正在迭代的字段是SomeClass
,不是吗?
如果是这样,你必须传递给它的值的参数是SomeClass
或者任何东西的intance,如果该字段是静态的,在你的例子中就是这种情况。
AbstractClass<?> flag = (AbstractClass<?>) field.get(null);
请注意,最好将其拆分为两步,以检查field.get
返回的内容是AbstractClass