自从Junit3引进Hamcrest匹配器框架以来,对用Java写单元测试在2个方面有极大的帮助,一个是测试的可读性,一个对失败测试的信息展示。
注:Hamcrest是一个开源的编写匹配器的框架,支持多种语言,Java,Python, Object-C和Ruby。你可以在Github看到所有的源代码:https://github.com/hamcrest
Hamcrest本身自带了很多常用的Matcher, 比方说 equalTo(), notNullValue()等等, 详细的信息可以在Hamcrest的官网查询到。 除了自带的Matcher以外,Hamcrest最大优势还在于你可以轻松的编写自己需要的matcher,以增加测试代码的可读性。例如:
假设你有一个Record对象,从中你可以析取出很多的对象,你想测试析取出对象的属性都来自于这个Record对象, 按照以前的做法,我们需要获取析取出的对象的每一个属性,然后去和原Record的对性属性值比较是否相等,当面对你一个有大量属性的对象时,毫无疑问会有一大堆的get方法,一大堆的equalTo, 我们为什么不能把这样的逻辑封装起来呢? 下面我们就来看一下如何编写一个自己的Matcher。
首先,假设有如下的一个Record对象:
public class MyRecord {
private String name;
private int age;
private String gender;
private String address;
private String phone;
private String email;
我们会把该对象的address,phone,email属性,析取成一个Contact对象:
public Contact generateContact() {
Contact contact = new Contact();
contact.setEmail(email);
contact.setPhone(phone);
contact.setAddress(address);
return contact;
}
我希望的测试能够测试该析取方法,我的测试代码如下:
@Test
public void ContactShouldGenerateFromMyRecord() throws Exception {
Contact contact = record.generateContact();
assertThat(contact, is(generateFrom(record)));
}
@Test
public void newCreateContactShouldNotGenerateFromMyRecord() throws Exception {
Contact contact = new Contact();
assertThat(contact, is(generateFrom(record)));
}
这儿的generateFrom就是我定制的一个Matcher。实现一个Matcher很简单,只需要继承TypeSafeMatcher之类的Hamcrest开发出来的类,然后实现其中的abstract方法就行了。
public class GenerateFrom extends TypeSafeMatcher<Contact> {
private MyRecord record;
public GenerateFrom(MyRecord record) {
this.record = record;
}
@Override
public boolean matchesSafely(Contact item) {
return StringUtils.equals(item.getAddress(),record.getAddress())
&& StringUtils.equals(item.getEmail(),record.getEmail())
&& StringUtils.equals(item.getPhone(),record.getPhone());
}
@Override
public void describeTo(Description description) {
description.appendValue("not extract from record");
}
@Factory
public static Matcher<Contact> generateFrom(MyRecord record){
return new GenerateFrom(record);
}
}
分享到:
相关推荐
此外,Go-Hamcrest支持自定义匹配器,这使得我们可以根据项目需求创建自己的验证规则。自定义匹配器通常通过实现`Matcher`接口来完成,该接口包含一个`Matches()`方法,用于检查输入值是否符合预期: ```go type ...
Hamcrest是一个Java库,它提供了匹配对象的框架,主要用于单元测试中断言的编写。标题"hamcrest-1.3.zip"指的是这个库的1.3版本被压缩成一个ZIP文件,其中包含了相关的jar包和文档资料。在本文中,我们将深入探讨...
例如,你可以使用assertThat方法,配合hamcrest的Matcher来断言预期的结果,如下所示: ```java import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @Test public void ...
- **类型安全**: Hamcrest提供了类型安全的匹配器,例如`hasProperty()`允许你指定对象的属性并进行匹配,避免了运行时类型转换错误。 - **可组合性**: 由于`Matcher`接口的可组合性,可以创建出高度定制的验证...
hamcrest-core是Hamcrest框架的基础模块,包含了一系列预定义的匹配器(Matcher),这些匹配器可以用来验证对象是否符合特定条件。它提供了一种声明式的方式,用于编写清晰、可读性强的测试代码,使得测试意图更加...
Hamcrest是一个用于单元测试的开源库,它的核心特性在于提供了一种强大的匹配器(Matcher)框架,使得开发者可以方便地定义自己的测试规则。这个框架的1.3RC0版本引入了一系列改进和优化,进一步提升了测试的灵活性...
通过查看源码,我们可以了解Hamcrest内部的工作原理,定制自己的Matcher,或者在遇到问题时进行深入调试。 4. **使用示例** 以下是一个简单的JUnit测试用例,展示了如何使用Hamcrest进行断言: ```java import ...
在`hamcrest`库中,`Matcher`接口定义了匹配对象的基本行为,包括`matches(Object item)`方法来判断给定的对象是否匹配,以及`describeTo(Description description)`方法来描述这个匹配器的行为。而`BaseMatcher`类...
3. **编写测试类**:使用JUnit4.11注解(如@Test、@Before、@After等)创建测试类,然后使用Hamcrest提供的Matcher来编写断言。例如,你可以用`assertThat()`方法结合Hamcrest的Matcher来断言预期的结果: ```java ...
《Hamcrest Core在JUnit测试中的应用与版本解析》 在软件开发中,单元测试是确保代码质量的重要环节,而JUnit作为...无论你是初学者还是经验丰富的开发者,掌握Hamcrest Core的用法都能使你的测试代码更加专业和高效。
Hamcrest提供了一组丰富的匹配器(Matcher)类,这些类可以用来定义期望值。在JUnit测试中,我们可以使用Hamcrest的匹配器来编写更加清晰、表达性强的断言。例如,我们可以使用`assertThat()`方法结合Hamcrest的匹配...
- **Hamcrest与JUnit的整合**:在JUnit中引入Hamcrest库,可以通过JUnit的assertions方法配合Hamcrest的Matcher,实现更精确、更具表达力的测试。 3. JUnit5的新特性: - **Lambda支持**:JUnit5支持Java 8的...
3. **自定义匹配器**:用户可以通过实现Matcher接口或使用Predicate来创建自己的匹配规则,以满足特定的测试需求。 4. **类型安全**:Hamcrest使用泛型来保证匹配器和预期值之间的类型一致性,减少了运行时错误的...
1. **Hamcrest Core**:这是Hamcrest的基础部分,它定义了匹配器(Matcher)接口和一系列基础的匹配器实现,如equalTo、instanceOf和isNull等。这些匹配器允许开发者创建复杂的逻辑表达式来检查对象的属性或行为。...
在实际项目中,当你在JUnit测试中引入这两个jar包后,你的测试代码将能够编写出更具有表达力的断言,从而提高代码的可读性和测试的准确性。例如: ```java import org.junit.Test; import static org.junit.Assert....
而Hamcrest通过如`assertThat()`方法结合Matcher,可以编写出更具语义的断言,如`assertThat(actual, is(expected))`,这使得测试意图更加明确。 4. **匹配器(Matcher)** 匹配器是Hamcrest的核心概念,它定义了...
这两个JAR文件是Hamcrest框架的基础,它们提供了丰富的匹配器(Matcher)类和API,帮助开发者编写更清晰、更具表达力的测试代码。 `core.jar`是Hamcrest的核心模块,包含了基本的匹配器实现和核心API。这个模块提供...
Java测试领域中,Hamcrest是一个强大的库,它使得编写具有表现力的断言变得更加简单和直观。本篇文章将深入探讨如何使用Hamcrest来编写富有表现力的单元测试。 **Hamcrest简介** Hamcrest是一个Java匹配器库,它的...