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

Junit AssertJ到Hamcrest等价性(仅适用于Spring MVC测试):如何测试集合中的每个POJO项(带日期),junit,hamcrest,spring-mvc-test,assertj,Junit,Hamcrest,Spring Mvc Test,Assertj,对于Spring Framework应用程序,关于测试: 业务层正在使用AssertJ和JUnit。 web层使用JUnit和SpringMVC测试,后者强制使用Hamcrest。看,答案是否定的 如果可以在AssertJ中对集合应用以下内容: 这三种方法的最佳等效近似值是: 确切地说 元组 作语法分析 适用于: .andExpect(model().attribute("personas", ???) 我在谷歌做了一项研究: 关于集合有简单集合的示例字符串、带hasItems的整数 关于日

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

业务层正在使用AssertJ和JUnit。 web层使用JUnit和SpringMVC测试,后者强制使用Hamcrest。看,答案是否定的 如果可以在AssertJ中对集合应用以下内容:

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

确切地说 元组 作语法分析 适用于:

 .andExpect(model().attribute("personas", ???)
我在谷歌做了一项研究:

关于集合有简单集合的示例字符串、带hasItems的整数 关于日期,只处理日期对象,当然是同一类型,但也不处理字符串。
请看一下这些测试示例:

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")))
                            )
                    ));

        }
}
让我们详细回顾一下:

确切地说

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

元组

可由allOf和hasProperty的组合替换。在我看来,它看起来很难看,我会考虑使用新的角色,b,c。除非您有一些不想验证的额外字段

解析


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

谢谢你。它起作用了。大约1虽然hasItem更像assertj.contains,但您是否可以添加一个新的@Test方法?我不确定是否理解您的观点。2在我看来,它看起来很难看,我会考虑使用新的人物角色,b,c,即使是难看的,我同意,是详细的是为了演示目的,以了解返回的内容,但是你能添加一个新的@Test方法吗?。3我理解,只是好奇,新的SimpleDataFormatyyy-MM-dd出现在哪里?我确实在parse方法中执行了Ctrl+Click启动,但我找不到sentence@ManuelJordan1为了更好地理解它,你可以自己尝试一下。创建一个由两个人组成的列表,并尝试由一个人运行contains和hasItem。结果会有所不同。2代替比较精确的字段,你可以比较整个对象,比如contains new Person1,2,3,,new Person2,4,5.3你应该更精确地看一下,一切都在那里:D
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")))
                            )
                    ));

        }
}