Hamcrest 对象匹配器简介
Contents
1. 概述
**Hamcrest 提供了使单元测试断言更简单易读的匹配器。**您可以在此处 开始探索一些可用的匹配器。
在本快速教程中,我们将更深入地研究对象匹配器。
2. 设置
要获取 Hamcrest,我们只需要将以下 Maven 依赖项添加到我们的pom.xml中:
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>java-hamcrest</artifactId>
<version>2.0.0.0</version>
<scope>test</scope>
</dependency>
最新的 Hamcrest 版本可以在Maven Central 上找到。
3.对象匹配器
对象匹配器旨在对对象的属性执行检查。
在研究匹配器之前,我们将创建几个 bean 以使示例易于理解。
我们的第一个对象称为Location并且没有属性:
public class Location {}
我们将命名我们的第二个 bean City并向其添加以下实现:
public class City extends Location {
String name;
String state;
// standard constructor, getters and setters
@Override
public String toString() {
if (this.name == null && this.state == null) {
return null;
}
StringBuilder sb = new StringBuilder();
sb.append("[");
sb.append("Name: ");
sb.append(this.name);
sb.append(", ");
sb.append("State: ");
sb.append(this.state);
sb.append("]");
return sb.toString();
}
}
请注意,City扩展了Location。我们稍后会用到它。现在,让我们从对象匹配器开始!
3.1. hasToString
顾名思义,hasToString方法验证某个对象是否具有返回特定String的toString方法:**
@Test
public void givenACity_whenHasToString_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city, hasToString("[Name: San Francisco, State: CA]"));
}
因此,我们正在创建一个City并验证其toString方法是否返回我们想要的String。我们可以更进一步,不检查是否相等,而是检查其他条件:
@Test
public void givenACity_whenHasToStringEqualToIgnoringCase_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city, hasToString(
equalToIgnoringCase("[NAME: SAN FRANCISCO, STATE: CA]")));
}
如我们所见,hasToString被重载并且可以接收字符串或文本匹配器作为参数**。所以,我们也可以这样做:
@Test
public void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() {
City city = new City(null, null);
assertThat(city, hasToString(emptyOrNullString()));
}
您可以在此处 找到有关文本匹配器的更多信息。现在让我们转到下一个对象匹配器。
3.2. is-a
这个匹配器代表一个is-a关系。我们的Location超类在这里发挥作用:
@Test
public void givenACity_whenTypeCompatibleWithLocation_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(typeCompatibleWith(Location.class)));
}
这就是说City is-a Location,这是真的,这个测试应该通过。另外,如果我们想测试负面情况:
@Test
public void givenACity_whenTypeNotCompatibleWithString_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(not(typeCompatibleWith(String.class))));
}
当然,我们的City类不是String。
最后,请注意所有 Java 对象都应通过以下测试:
@Test
public void givenACity_whenTypeCompatibleWithObject_thenCorrect() {
City city = new City("San Francisco", "CA");
assertThat(city.getClass(), is(typeCompatibleWith(Object.class)));
}
请记住,匹配器由另一个匹配器的包装器组成,目的是使整个断言更具可读性。