我有一个类别的类:
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
。
另一种方法是仅访问所有变量变量,变量2等,从静态上访问键,并在其上执行断言。但是,显然,这意味着,如果某人在SomeClass
中添加了一个新字段,则有人必须手动修改测试文件并写出断言。这并没有真正的帮助,因为人们可能会忘记编写测试。
所以我认为使用反射可以解决。但是,我认为使用反思是不可能的,所以想知道是否有任何方法可以解决这个问题?另外,任何其他可以自动进行测试的方法,以便测试添加所有字段,而开发人员不必担心它?
您要迭代的字段是 SomeClass
'不是吗?
如果是这样,您必须传递以获得其值的参数是SomeClass
或任何其他字段静态的意图,实际上在您的示例中是这种情况。
AbstractClass<?> flag = (AbstractClass<?>) field.get(null);
请注意,最好以两个步骤将其拆分,以检查field.get
返回的内容是否是AbstractClass