Hamcrest对象匹配器

2023/05/12

1. 概述

Hamcrest提供了匹配器,使单元测试断言更简单、更清晰;在这个快速教程中,我们深入介绍对象匹配器。

2. Maven

我们只需将以下Maven依赖项添加到我们的pom.xml中:

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>java-hamcrest</artifactId>
    <version>2.0.0.0</version>
    <scope>test</scope>
</dependency>

3. 对象匹配器

对象匹配器旨在对对象的属性进行检查,首先我们创建几个bean。

第一个对象为Location并且没有属性:

public class Location {}

第二个类为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;
		return "[" +
				"Name: " +
				this.name +
				", " +
				"State: " +
				this.state +
				"]";
	}
}

请注意,City继承Location了,我们稍后会用到它。

3.1 hasToString

顾名思义,hasToString方法验证某个对象是否有一个返回特定String的toString方法

@Test
void givenACity_whenHasToString_thenCorrect() {
    City city = new City("San Francisco", "CA");
    
    assertThat(city, hasToString("[Name: San Francisco, State: CA]"));
}

我们创建一个City并验证其toString方法是否返回了我们想要的字符串。

我们也可以检查其他条件:

@Test
void givenACity_whenHasToStringEqualToIgnoringCase_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city, hasToString(equalToIgnoringCase("[NAME: SAN FRANCISCO, STATE: CA]")));
}

如我们所见,hasToString是重载的,可以接收String或文本匹配器作为参数;因此,我们还可以执行以下操作:

@Test
void givenACity_whenHasToStringEmptyOrNullString_thenCorrect() {
    City city = new City(null, null);
    
    assertThat(city, hasToString(emptyOrNullString()));
}

3.2 typeCompatibleWith

这个匹配器代表一种is-a关系,这里使用Location作为演示:

@Test
void givenACity_whenTypeCompatibleWithLocation_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city.getClass(), is(typeCompatibleWith(Location.class)));
}

上面的测试表示City是一个Location,这是正确的,因此该测试应该通过;另外,如果我们想测试否定的情况:

@Test
void givenACity_whenTypeNotCompatibleWithString_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city.getClass(), is(not(typeCompatibleWith(String.class))));
}

当然,我们的City类不是字符串。最后,所有Java对象都应该通过以下测试:

@Test
void givenACity_whenTypeCompatibleWithObject_thenCorrect() {
    City city = new City("San Francisco", "CA");

    assertThat(city.getClass(), is(typeCompatibleWith(Object.class)));
}

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

4. 总结

Hamcrest提供了一种简单而干净的方法来创建断言,有各种各样的匹配器可以供开发人员使用。对象匹配器是检查类属性的一种简单方式

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章