java - 从对象集合中测试集合属性的内容

标签 java testing collections mockito

抱歉,我尽量让这个标题变得清晰。不要犹豫,编辑以改进它。

我的问题是我想测试这个结构的内容,更具体地说是 B 对象的内容,并确保它对应于特定的 A 值:

public class A {
    String key;
    List<B> bs;
}

我的数据有这种形式

List<A> as = [
    {
        key : "KEY1", 
        bs: [
            {val1:"val1", val2:"val2}
        ]
    },
    {
        key : "KEY2", 
        bs: [
            {val1:"val3", val2:"val4"}, 
            {val1:"val5", val2:"val6"}
        ]
    },
];

在使用 Mockito 进行单元测试的上下文中,我希望能够在不进行预处理的情况下测试此结构以获取 B 的列表。通过测试此结构,我想确保有两个 B KEY2 和第一个 B 有 val3 和 val4,第二个 val5 和 val6。

目前,我必须按键创建 map 并测试每个条目。如果存在的话,我希望以更直接的方式进行。

这是我的实际测试。

List<A> as = captor.getAllValues();
assertThat(as)
            .isNotNull()
            .hasSize(2)
            .extracting("key")
            .containsOnlyOnce(
                    tuple("KEY1"),
                    tuple("KEY2")
            );

    Map<String, A> estimationParPlateforme = indexBy(as, new Indexer<String, A>() {
        @Override
        public String apply(A a) {
            return a.getKey();
        }
    });

assertThat(as.get("KEY1").getBs())
            .isNotEmpty()
            .extracting(
                    "val1",
                    "val2"
            )
            .containsExactly(
                    tuple(
                            "val1",
                            "val2"
                    )
            );

assertThat(as.get("KEY2").getBs())
            .isNotEmpty()
            .extracting(
                    "val1",
                    "val2"
            )
            .containsExactly(
                    tuple(
                            "val3",
                            "val4"
                    ),
                    tuple(
                            "val5",
                            "val6"
                    )
            ); 

我认为测试时间有点长,我想找到一种方法来改进它。你有什么解决办法吗?

感谢您的帮助

最佳答案

您必须定义数据结构的外观。目前,您将所有这些信息分散在您的测试语句中。正如您已经想到的那样,这使它变得非常丑陋。我喜欢做的是有一些数据结构,我可以用我期望的数据填充。然后我可以用它来测试我的数据是否有效。一个例子:

static Map<String, B[]> expectedBs = new HashMap<String, B[]>();

public static void main(String[] args) {
    //put the expected values into a map
    expectedBs.put("KEY1", new B[] { new B("val1", "val2") });
    expectedBs.put("KEY2", new B[] { new B("val3", "val4"), new B("val5", "val6") });

    //build a valid datastructure
    List<A> as = new ArrayList<A>();
    List<B> bs1 = new ArrayList<B>();
    bs1.add(new B("val1", "val2"));

    List<B> bs2 = new ArrayList<B>();
    bs2.add(new B("val3", "val4"));
    bs2.add(new B("val5", "val6"));

    as.add(new A("KEY1", bs1));
    as.add(new A("KEY2", bs2));


    //test validity of as
    System.out.println(isValid(as)); //prints true

    //modify the datastructure such that it is not valid anymore
    bs1.get(0).val1 = "val2";

    //test validity once more
    System.out.println(isValid(as)); //prints false
}

static boolean isValid(List<A> as) {
    for (A a : as) {
        B[] expected = expectedBs.get(a.key);
        if (!equals(a.bs, expected))
            return false;
    }
    return true;
}

static boolean equals(List<B> x, B[] y) {
    if (x == null)
        return false;
    if (y == null)
        return false;
    if (x.size() != y.length)
        return false;
    for (int i = 0; i < x.size(); i++)
        if (!x.get(i).equals(y[i]))
            return false;
    return true;
}

答:

public class A {
    String key;
    List<B> bs;

    public A(String key, List<B> bs) {
        this.key = key;
        this.bs = bs;
    }
}

乙:

public class B {
    String val1, val2;
    public B(String val1, String val2) {
        this.val1 = val1;
        this.val2 = val2;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (!(obj instanceof B))
            return false;
        B objB = (B) obj;
        if (!objB.val1.equals(this.val1))
            return false;
        if (!objB.val2.equals(this.val2))
            return false;
        return true;
    }
}

抱歉代码这么长。希望你明白了。这是否更优雅由您决定。

关于java - 从对象集合中测试集合属性的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36355936/

相关文章:

unit-testing - Specflow - 有没有办法管理背景,使其仅针对功能中的某些场景运行?

java - java中不可修改列表的类型是什么

mongodb - 使用 Meteor 时,我无法从客户端控制台访问集合?

java - Thread.sleep() 到 Swing 定时器的转换

java - 如何在java中向表单添加变量并通过doPost获取它们

java - 如何比较二维数组

java - 验证 selenium 中的动态页面

java - 如果子字符串不在我的原始字符串中,如何避免 StringIndexOutOfBoundsException?

angularjs - 如何在 Protractor 测试中获取页面上的所有内容/文本?

Scala:基于类型参数过滤集合