使用反射从列表中获取对象

埃尔基(Erki M.)

我正在编写一些webdriver测试,用于验证网页。页面主要包含Web表格。我将测试数据存储在对象中,因此将期望的对象传递给测试,并将其与网页中的实际对象进行比较。测试数据对象非常简单,并且大多数只包含一串字符串:

public class PetOwnerDTO {
    private String ownerPhoneNr;
    private String ownerEmail;
    private String ownerAddress;
    // getters and setters skipped
}

现在,由于有许多不同的对象需要验证,因此我试图开发一个通用的对象比较器来为我做这件事。我已经拥有的:

package Helpers;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.List;

import static junit.framework.TestCase.fail;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalToIgnoringCase;

public class ObjectComparer {

    public static void compareObjects(Object obj1, Object obj2) {
        assertThat(obj1, is(notNullValue()));
        assertThat(obj2, is(notNullValue()));
        Class obj1Class = obj1.getClass();
        Class obj2Class = obj2.getClass();
        assertThat(obj1Class, is(sameInstance(obj2Class)));
        if (obj1Class.isArray()) {
            assertThat("Object2 is not an array", (obj2Class.isArray()));
            assertThat(Array.getLength(obj1), is(equalTo(Array.getLength(obj2))));
            for (int i = 0; i < Array.getLength(obj1); i++) {
                Object value1 = Array.get(obj1, i);
                Object value2 = Array.get(obj2, i);
                compareObjects(value1, value2);
            }
        }
        if (obj1 instanceof List<?>){
            throw new RuntimeException("Lists not supported, use looping");
        }
        Field[] fieldsObj1 = obj1Class.getDeclaredFields();
        Field[] fieldsObj2 = obj2Class.getDeclaredFields();
        assertThat(fieldsObj1.length, is(equalTo(fieldsObj2.length)));
        for (int i = 0; i < fieldsObj1.length; i++) {
            fieldsObj1[i].setAccessible(true);
            fieldsObj2[i].setAccessible(true);
            try {
                Object valueObj1 = fieldsObj1[i].get(obj1);
                Object valueObj2 = fieldsObj2[i].get(obj2);
                assertThat(valueObj1.toString(), is(equalToIgnoringCase(valueObj2.toString())));
            } catch (IllegalAccessException e) {
                fail("Unable to compare objects");
            }
        }
    }
}

问题出在第二种情况:

if (obj1 instanceof List<?>){

如何从列表中获取对象?类似于Array.get()吗?还是有更好的方法呢?

邓肯·琼斯(Duncan Jones)

看来您正在尝试避免equals()在每个测试对象中实施那使我感到一个不好的主意。有许多方法可以加快equals()方法的实现,包括:

  • 让您的IDE生成它。Eclipse当然支持这种想法。

  • 依靠第三方库,例如Apache Commons Lang EqualsBuilder,它看起来可能很简单:

    @Override
    public boolean equals(Object obj) {
      return EqualsBuilder.reflectionEquals(this, obj);
    }
    

我强烈建议您采用其中一种方法,而不是构造一个基于狡猾的基于反射的类,该类在逐个字段的基础上测试相等性。拥有适当的相等方法有很多好处,包括:

  • 将这些项目放在一组中时的正确行为。
  • 能够调用普通的JUnit断言(assertEquals()等)

hashCode()更改时不要忘记写一个方法equals()再次,有一些快捷方式(包括HashCodeBuilder)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Linq获取列表中对象的索引

来自分类Dev

使用反射从集合类获取对象

来自分类Dev

使用反射,获取对象的父类/字段

来自分类Dev

使用反射从复杂类中获取价值

来自分类Dev

如何使用反射从动态(匿名类型)对象获取属性?

来自分类Dev

如何使用反射获取对象字段的对象引用?

来自分类Dev

如何使用JavaScript从对象列表中获取重复的IP地址?

来自分类Dev

使用Javascript或JQuery从对象列表中获取所有值

来自分类Dev

C#反射获取嵌套属性类型中GetValues的对象

来自分类Dev

如何使用反射从字段/类中获取对象?

来自分类Dev

从列表中获取对象Java

来自分类Dev

使用反射和getCount(.net 4)从对象获取集合

来自分类Dev

如何使用反射将对象添加到类的实例的泛型列表属性中

来自分类Dev

如何使用反射获取另一个对象内的对象列表

来自分类Dev

使用反射获取类内列表属性的count属性值

来自分类Dev

从响应中获取对象列表

来自分类Dev

使用JavaScript从动态对象列表中获取价值

来自分类Dev

使用通用类型对象的反射获取属性

来自分类Dev

获取C#中的单个属性值的列表-反射

来自分类Dev

如何使用反射从动态(匿名类型)对象获取属性?

来自分类Dev

如何在Android项目中使用java反射获取超类中的子类列表

来自分类Dev

使用反射从列表中检索值

来自分类Dev

如何使用反射获取特定类型的通用列表

来自分类Dev

使用LINQ从对象列表中获取不同的参数列表

来自分类Dev

使用反射将类中的所有静态属性作为对象获取VB.NET

来自分类Dev

使用反射获取列表属性类型

来自分类Dev

从对象列表中获取值

来自分类Dev

如何使用jstl从对象内部的对象列表中获取数据

来自分类Dev

使用 Scala 反射从对象中获取原始字段的类型

Related 相关文章

  1. 1

    使用Linq获取列表中对象的索引

  2. 2

    使用反射从集合类获取对象

  3. 3

    使用反射,获取对象的父类/字段

  4. 4

    使用反射从复杂类中获取价值

  5. 5

    如何使用反射从动态(匿名类型)对象获取属性?

  6. 6

    如何使用反射获取对象字段的对象引用?

  7. 7

    如何使用JavaScript从对象列表中获取重复的IP地址?

  8. 8

    使用Javascript或JQuery从对象列表中获取所有值

  9. 9

    C#反射获取嵌套属性类型中GetValues的对象

  10. 10

    如何使用反射从字段/类中获取对象?

  11. 11

    从列表中获取对象Java

  12. 12

    使用反射和getCount(.net 4)从对象获取集合

  13. 13

    如何使用反射将对象添加到类的实例的泛型列表属性中

  14. 14

    如何使用反射获取另一个对象内的对象列表

  15. 15

    使用反射获取类内列表属性的count属性值

  16. 16

    从响应中获取对象列表

  17. 17

    使用JavaScript从动态对象列表中获取价值

  18. 18

    使用通用类型对象的反射获取属性

  19. 19

    获取C#中的单个属性值的列表-反射

  20. 20

    如何使用反射从动态(匿名类型)对象获取属性?

  21. 21

    如何在Android项目中使用java反射获取超类中的子类列表

  22. 22

    使用反射从列表中检索值

  23. 23

    如何使用反射获取特定类型的通用列表

  24. 24

    使用LINQ从对象列表中获取不同的参数列表

  25. 25

    使用反射将类中的所有静态属性作为对象获取VB.NET

  26. 26

    使用反射获取列表属性类型

  27. 27

    从对象列表中获取值

  28. 28

    如何使用jstl从对象内部的对象列表中获取数据

  29. 29

    使用 Scala 反射从对象中获取原始字段的类型

热门标签

归档