AssertJ to Hamcrest 等效性(仅适用于春季 MVC 测试):如何测试集合的每个 POJO 项(带有日期



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

  • 业务层正在使用AssertJJUnit
  • Web 层正在使用 JUnitSpring MVC Test ,后者强制使用 Hamcrest请参阅有没有办法在Spring MVC测试中使用AssertJ断言?(答案是否定的(

如果可能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", ???)

我在谷歌上做了一个研究:

  • 关于集合 有简单集合的样本(StringIntegerhasItems(
  • 关于日期,处理Date对象,当然是相同的类型,但不能处理String

请看一下这些测试示例:

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.

可替换为 allOfhasProperty 的组合。在我看来,它看起来很丑,我会考虑只使用new Person("a","b","c").除非您有一些不想验证的额外字段。

解析

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

最新更新