微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于扩展fit.RowFixture和fit.TypeAdapter的建议,以便我可以绑定/调用在地图中保持attrs的类

如何解决关于扩展fit.RowFixture和fit.TypeAdapter的建议,以便我可以绑定/调用在地图中保持attrs的类

| TLDR:我想知道如何扩展fit.TypeAdaptor,以便我可以调用一个期望参数的方法,因为TypeAdaptor的认实现通过反射调用绑定的(bound?)方法,并假定它是一个无参数方法... 较长版本- 我正在使用fit为我的系统(一个返回自定义对象排序列表的服务)构建测试工具。为了验证系统,我认为我会使用fit.RowFixture来声明列表项的属性。 由于RowFixture期望数据是公共属性或公共方法,因此我想到了在自定义对象上使用包装器(例如InstanceWrapper)-我也尝试实现该先前线程中给出的关于在RowFixture中格式化数据的建议。 问题在于我的自定义对象具有约41个属性,我想为测试人员提供选择他们要在此RowFixture中验证哪些属性的选项。另外,除非我向InstanceWrapper类动态添加字段/方法,否则RowFixture将如何调用我的任何一个getter,因为两者都希望属性名称作为参数传递(下面复制的代码)? 我扩展了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);
    }
}
    

解决方法

对于它的价值,这是我最终解决该问题的方法: 我创建了一个自定义
TypeAdapter
(扩展TypeAdapter),并带有附加的公共属性(字符串)
attrName
。也:
@Override
public Object invoke() throws IllegalAccessException,InvocationTargetException {

    if (\"getAttribute\".equals(method.getName())) {
        Object params[] = { attrName };
        return method.invoke(target,params);
    } else {
        return super.invoke();
    }
}
然后我扩展
fit.RowFixture
并进行以下覆盖:
public getTargetClass()
-返回我的课程参考
protected TypeAdapter bindField(String name)
抛出异常-这是
ColumnFixture
中的一个受保护方法,我对其进行了修改,以便它将使用我的类的getter方法:
@Override
protected TypeAdapter bindField(String name) throws Exception {

    String fieldName = camel(name);

    // for all attributes,use method getAttribute(String)
    Class methodParams[] = new Class[1];
    methodParams[0] = String.class;

    TypeAdapter a = TypeAdapter.on(this,getTargetClass().getMethod(\"getAttribute\",methodParams));

    PHETypeAdapter pheAdapter = new PHETypeAdapter(fieldName);
    pheAdapter.target = a.target;
    pheAdapter.fixture = a.fixture;
    pheAdapter.field = a.field;
    pheAdapter.method = a.method;
    pheAdapter.type = a.type;

    return pheAdapter;

}
我知道这不是一个很好的解决方案,但这是我能想到的最好的解决方案。也许我会在这里得到一些更好的解决方案:-)     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。