对于Spring Framework
应用程序,关于测试:
- 业务层正在使用
AssertJ
和JUnit
。 - Web 层正在使用
JUnit
和Spring 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", ???)
我在谷歌上做了一个研究:
- 关于集合 有简单集合的样本(
String
,Integer
带hasItems
( - 关于日期,只处理
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
.
元
可替换为 allOf
和 hasProperty
的组合。在我看来,它看起来很丑,我会考虑只使用new Person("a","b","c")
.除非您有一些不想验证的额外字段。
解析
在这里,我只是对它们使用了相同的方法。如果你对它进行更精确的观察,你会发现这种方法与匹配器无关。它只是使用 new SimpleDateFormat("yyyy-MM-dd")
解析迄今为止的字符串。如果您不想使用assertj's
则可以轻松地将其提取到某个util类中。