AssertJ到Hamcrest等价(仅适用于Spring MVC测试):如何测试集合中的每个POJO项(带日期)

时间:2018-04-28 22:20:12

标签: junit hamcrest spring-mvc-test assertj

对于Spring Framework应用,关于测试:

如果在AssertJ中可以将以下内容应用于集合

.containsExactly(tuple("087", "Peter", "Jordani", parse("1980-01-01")),
                 ...
                 tuple("088", "Isaias", "Jordano", parse("1980-01-01")))

这三种方法的最佳等效近似值是什么:

  • containsExactly
  • tuple
  • parse

适用于:

 .andExpect(model().attribute("personas", ???)

我在谷歌做了一项研究:

  • 关于集合,有简单集合的示例(StringInteger hasItems
  • 关于日期,仅使用 Date个对象,当然是相同的类型,但也不是String

1 个答案:

答案 0 :(得分:1)

请看一下这些测试示例:

public class Test {
        private List<Person> personList;
        private Person peter = new Person("087", "Peter", parse("1980-01-01"));
        private Person john = new Person("081", "John", parse("1980-01-22"));

        @BeforeEach
        void setup() {
            personList = new ArrayList<>();
            personList.add(peter);
            personList.add(john);
        }

        @Test
        void assertjTest() {
            assertThat(personList).extracting("age", "name", "date")
                    .containsExactly(
                            tuple("087", "Peter", parse("1980-01-01")),
                            tuple("081", "John", parse("1980-01-22"))
                    );
        }

        @Test
        void hamcrestTest() {
            org.hamcrest.MatcherAssert.assertThat(personList,
                    contains(
                            allOf(
                                    hasProperty("age", is("087")),
                                    hasProperty("name", is("Peter")),
                                    hasProperty("date", is(parse("1980-01-01")))
                            ),
                            allOf(
                                    hasProperty("age", is("081")),
                                    hasProperty("name", is("John")),
                                    hasProperty("date", is(parse("1980-01-22")))
                            )
                    ));

        }
}

让我们详细检讨:

<强> containsExactly

contains方法是它的替代方法。而hasItem更像assertj.contains

<强>元组

可以由allOfhasProperty的组合替换。在我看来,它看起来很难看,我会想到只使用new Person("a","b","c")。除非你有一些额外的字段,你不想验证。

<强>解析

我在这里使用了相同的方法。如果您对它进行更精确的观察,您会注意到此方法与匹配器无关。它只是使用new SimpleDateFormat("yyyy-MM-dd")解析字符串到目前为止。如果您不想使用assertj's,可以轻松地将其提取到某个util类。