junit之Matcher,Assert.assertThat

本文深入解析JUnit中的Matcher接口及其实现类,并通过实例演示如何使用assertThat进行条件匹配,包括is、not、equalTo、instanceOf、allOf等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文基于junit-4.10

一、理解Matcher

为了详细说明assertThat的使用,我们需要了解Matcher这个接口及其实现类。

下面我们先直接看一下UML图,有个对相关接口和类的概念。

图一:Matcher接口,及其父接口和直接实现类


图二:BaseMatcher的子类



public interface Matcher<T> extends SelfDescribing {
    boolean matches(Object var1);

    void _dont_implement_Matcher___instead_extend_BaseMatcher_();
}

上图是Matcher的源码,可以看到,它的内容很简单。matcher翻译过来的意思是匹配器,对于Matcher类型的变量,我们这里就将它称为匹配器。
对于一个匹配器,就是可接受值的一个匹配。比如,assertThat(8,is(8)); 判断8是不是8。其中is(8)返回的是一个Matcher类型的变量,也就是一个匹配器,在这里,它可接受的值是8. 
匹配器能够描述自身并在失败时给出反馈。
还有要注意的就是,Matcher的实现类不应该直接实现这个接口。相反,应该扩展BaseMatcher抽象类(例如上面的AnyOf,Is,IsAnything等都是扩展BaseMatcher抽象类),这将确保Matcher API可以扩展以支持新功能,
并保持与所有Matcher实现兼容。为了方便访问常见的Matcher实现,建议使用CoreMatchers中的静态工厂方法,CoreMatchers类引入了上述的BaseMatcher的子类,这样不用一个一个地访问BaseMatcher的直接子类。

org.hamcrest.CoreMatchers的UML图如下:



二、assertThat

初步了解assertThat

assertThat是org.junit.Assert类里的方法。Assert类的声明是:public class Assert extends Object.

现在,我们来看一下assertThat方法的声明:

static
<T> void
assertThat(String reason, T actual, Matcher<T> matcher) 
          Asserts that actual satisfies the condition specified by matcher.
static
<T> void
assertThat(T actual, Matcher<T> matcher) 
          Asserts that actual satisfies the condition specified by matcher.

先看第一个。方法有三个参数,第一个是字符串类型的reason,表示关于错误的额外信息,也就是你可以自己书写的错误提示信息。第二个参数是泛型的actual,表示的是被比较的值。

前两个参数都比较简单,复杂的是第三个Matcher<T>类型的参数matcher。此参数是一个表达式,由Matcher构建,指定第二个参数actual允许的值。

第二个和第一个一样,只是少了一个参数。作用和使用方法完全一致。

assertThat使用实例

(注意,本文基于junit-4.10,其它版本可能会有差异,请读者注意

测试的时候,我们使用org.hamcrest.CoreMatchers里的静态方法

(1)is和not

assertThat(5,org.hamcrest.CoreMatchers.is(5));
assertThat('a',is('a'));
assertThat("people",is("people"));

assertThat(new Date(),is(Date.class));
assertThat(5 ,not(6));
assertThat('a',not('b'));
assertThat("people",not("dog"));
assertThat("日期类型不是字符串类型",date,is(String .class));

(2)equalTo

assertThat(8,equalTo(8));

assertThat('a',equalTo('a'));

assertThat("java",equalTo("java"));

(3)instanceOf

assertThat(new Date(),instanceOf(java.util.Date.class));
assertThat("java",instanceOf(java.lang.String.class));
(4)allOf和anyOf
assertThat("必须包含字符串java和web","java web",org.hamcrest.CoreMatchers.allOf(containsString("java"),containsString("web")));
assertThat("不是color,也不是colour","color",anyOf(containsString("color"), containsString("colour")));
(5)either

assertThat("color",either(containsString("color")).or(containsString("colour")));





















任务描述 学习如何在SpringBoot项目中对Service层做单元测试,并对案例创客众包模块中的一个Service(改编后)进行举一反三。 相关知识 SpringBoot中引入单元测试 SprinBoot中引入单元测试很简单,依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> Service层单元测试 Spring Boot中单元测试类写在在src/test/java目录下,你可以手动创建具体测试类,如果是IDEA,则可以通过IDEA自动创建测试类,如下图,也可以通过快捷键⇧⌘T(MAC)或者Ctrl+Shift+T(Window)来创建,如下: 创建好的测试类路径如下: 然后再编写创建好的测试类,具体代码如下: package com.dudu.service; import com.dudu.domain.LearnResource; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import static org.hamcrest.CoreMatchers.*; @RunWith(SpringRunner.class) @SpringBootTest public class LearnServiceTest { @Autowired private LearnService learnService; @Test public void getLearn(){ LearnResource learnResource=learnService.selectByKey(1); Assert.assertThat(learnResource.getAuthor(),is("嘟嘟")); } } 其中,第11行的注解@Runwith是Junit提供的注解,代表该类是单元测试的执行类。 第12行的注解@SpringBootTest替代了spring-test中的@ContextConfiguration注解,目的是加载ApplicationContext,启动spring容器。一般情况下,使用@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试。 第15行的注解@Autowired引入想测试的Service类。 第21行的assertThatJunit4全新的断言语法,基本语法如下: assertThat( [value], [matcher statement] ); value 是接下来想要测试的变量值; matcher statement 是使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 value 值与 matcher statement 所表达的期望值相符,则测试成功,否则测试失败。在上面的代码中,如果learnResource的作者是嘟嘟,则测试成功,否则测试失败。 assertThat优点: 以前 JUnit 提供了很多的 assertion 语句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,现在有了 JUnit 4.4,一条 assertThat 即可以替代所有的 assertion 语句,这样可以在所有的单元测试中只使用一个断言方法,使得编写测试用例变得简单,代码风格变得统一,测试代码也更容易维护。 上面就是最简单的单元测试写法,顶部只要@RunWith(SpringRunner.class)和@SpringBootTest即可,想要执行的时候,鼠标放在对应的方法,右键选择run该方法即可。 编程要求 根据提示,在右侧编辑器补充代码,完成对改编后的创客众包模块示例Service的单元测试。 测试说明 平台会对你编写的代码进行测试: 开始你的任务吧,祝你成功! package step3; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import static org.hamcrest.CoreMatchers.*; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootTestDemo1 { @Autowired private ProjectAchievementService projectAchievementService; @Test public void testGetProjectTagById(){ //获取id为666的项目标签 String tag = projectAchievementService.GetProjectTagById(666); /* 请在下面的Begin/End内补全测试函数, 要求:仿照左侧知识点使用assertThat,判断id为666的项目标签是否为“软件工程” 如果是,测试成功;如果不是,测试失败。 提示:用一行代码完成 */ /***********************Begin**************************/ /************************End***************************/ } }
最新发布
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值