TLDR:fit.TypeAdaptorを拡張して、TypeAdaptorのデフォルトの実装がリフレクションによってバインドされた(バインドされた?)メソッドを呼び出し、それがパラメーターなしのメソッドであると想定するときにパラメーターを期待するメソッドを呼び出すことができるようにする方法を知りたいです。
より長いバージョン- システムのテストハーネス(カスタムオブジェクトのソートされたリストを返すサービス)を構築するためにfitを使用しています。システムを検証するために、fit.RowFixtureを使用してリストアイテムの属性をアサートすると思いました。
RowFixtureは、データがパブリック属性またはパブリックメソッドのいずれかであることを想定しているため、カスタムオブジェクト(InstanceWrapperなど)のラッパーを使用することを考えました。また、RowFixtureでのデータのフォーマットに関するこの前のスレッドでの提案を実装しようとしました。
問題は、カスタムオブジェクトに約41個の属性があることです。テスターに、このRowFixtureで検証する属性を選択するオプションを提供したいと思います。さらに、フィールド/メソッドをInstanceWrapperクラスに動的に追加しない限り、RowFixtureはどちらのゲッターも属性名がパラメーターとして渡されることを期待しているため(以下にコピーされたコード)、どのように呼び出しますか?RowFixtureを拡張してメソッドにバインドしましたが、TypeAdaptorを拡張してattr名で呼び出す方法がわかりません。何か提案はありますか?
public class InstanceWrapper {
private Instance instance;
private Map<String, Object> attrs;
public int index;
public InstanceWrapper() {
super();
}
public InstanceWrapper(Instance instance) {
this.instance = instance;
init(); // initialise map
}
private void init() {
attrs = new HashMap<String, Object>();
String attrName;
for (AttrDef attrDef : instance.getModelDef().getAttrDefs()) {
attrName = attrDef.getAttrName();
attrs.put(attrName, instance.getChildScalar(attrName));
}
}
public String getAttribute(String attr) {
return attrs.get(attr).toString();
}
public String description(String attribute) {
return instance.getChildScalar(attribute).toString();
}
}
public class MyDisplayRules extends fit.RowFixture {
@Override
public Object[] query() {
List<Instance> list = PHEFixture.hierarchyList;
return convertInstances(list);
}
private Object[] convertInstances(List<Instance> instances) {
Object[] objects = new Object[instances.size()];
InstanceWrapper wrapper;
int index = 0;
for (Instance instance : instances) {
wrapper = new InstanceWrapper(instance);
wrapper.index = index;
objects[index++] = wrapper;
}
return objects;
}
@Override
public Class getTargetClass() {
return InstanceWrapper.class;
}
@Override
public Object parse(String s, Class type) throws Exception {
return super.parse(s, type);
}
@Override
protected void bind(Parse heads) {
columnBindings = new TypeAdapter[heads.size()];
for (int i = 0; heads != null; i++, heads = heads.more) {
String name = heads.text();
String suffix = "()";
try {
if (name.equals("")) {
columnBindings[i] = null;
} else if (name.endsWith(suffix)) {
columnBindings[i] = bindMethod("description", name.substring(0, name.length()
- suffix.length()));
} else {
columnBindings[i] = bindField(name);
}
} catch (Exception e) {
exception(heads, e);
}
}
}
protected TypeAdapter bindMethod(String name, String attribute) throws Exception {
Class partypes[] = new Class[1];
partypes[0] = String.class;
return PHETypeAdaptor.on(this, getTargetClass().getMethod("getAttribute", partypes), attribute);
}
}