Contents

Hamcrest 对象匹配器简介

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方法验证某个对象是否具有返回特定StringtoString方法:**

@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)));
}

请记住,匹配器由另一个匹配器的包装器组成,目的是使整个断言更具可读性。