简单的 JUnit 项目

回顾一下创建并运行简单的 JUnit 测试项目,先添加 JUnit 依赖然后编写类似如下模板的测试类,使用 IDE 的话直接用插件运行就行, 使用 Maven 的话运行命令 mvn test 就能看到测试结果。

public class Tests {
@Test
public void test() {
// ...
}
}

执行顺序

为满足一些测试对环境的要求,例如数据库连接及关闭,JUnit 提供了一系列注解来在测试前后进行操作,以下为注解运行的顺序的介绍。

  • @BeforeClass 运行测试类前执行且只执行一次
  • @Before 每个测试方法执行前执行
  • @Test 测试方法,每个测试方法的顺序也可以指定
  • @After 每个测试方法执行后执行
  • @AfterClass 运行测试类后执行且只执行一次

上面提到测试方法也可以指定顺序,利用 @FixMethodOrder 标注测试类。

@FixMethodOrder(MethodSorters.DEFAULT)
public class Tests {
// ...
}

MethodSorters 有三种取值,分别

代表不同的执行顺序。

  • DEFAULT 由方法名的 hashcode 值大小决定执行顺序,若值一样则根据方法名的字典顺序
  • NAME_ASCENDING 由方法名的字典顺序决定执行顺序
  • JVM 由 JVM 返回的方法名的顺序决定

断言

JUnit 的 org.junit.Assert 类提供了一系列静态方法用来断言,当断言不成立时会调用 fail 抛出 AssertionError 的异常,也可手动调用 fail 来抛出异常,下面列表为该类提供的静态方法。

  • assertTrue
  • assertFalse
  • assertNull
  • assertNotNull
  • assertSame
  • assertNotSame
  • assertEquals
  • assertArrayEquals
  • assertThat
  • fail

assertEquals 与 assertSame 区别

阅读源码可以知道,assertEquals 是调用对象的 equals 方法进行比较,而 assertSame 则是直接用 == 进行比较。

所以用 assertSame 来断言值类型或者内存地址是否相等,而用 assertEquals 来断言对象的 equals 方法是否为真。

assertThat 与 Matcher

assertThat 利用 matcher 匹配器来进行断言,其中一个方法签名如下所示。

assertThat(T actual, Matcher<T> matcher)

org.hamcrest.CoreMatchers 类中提供了匹配器静态的方法,可静态导入里头所有的方法,如下为用 assertThat 实现 assertTrue 的例子。

import static org.hamcrest.CoreMatchers.*;

public class Tests {
@Test
public void test() {
assertThat(true, is(true)); // same as assertTure()
}
}

另外还可以自定义匹配器,推荐继承 BaseMatcher<T> 抽象类而不是实现 Matcher<T> 接口,下面为一个简单的例子。

public class Tests {
private static Contains contains(String substring) {
return new Contains(substring);
}
@Test
public void test() {
assertThat("test", contains("t"));
}
} class Contains extends BaseMatcher<String> {
private String substring; public Contains(String substring) {
this.substring = substring;
} @Override
public boolean matches(Object str) {
return ((String)str).contains(substring);
} @Override
public void describeTo(Description description) {
// ...
}
}

Spring Boot 使用 JUnit

Spring Boot 中无需任何配置,就能使用 JUnit 来测试,下面是 Spring Boot 项目的自带的测试模板。

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Test
public void contextLoads() {
}
}

指定运行环境及加载配置

测试类标注了两个注解 ,JUnit 提供的 @RunWith 注解来指定运行环境,这里指定了 SpringRunner 即 Spring 的运行环境。

@SpringBootTest 注解则用来加载所需 Spring 环境所需要的配置,这样就可以在测试环境中自动装载所需要的 Bean 。

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
Foo foo; @Test
public void contextLoads() {
foo.bar();
}
}

加速测试

当有些测试不需要加载整个 Spring Boot 环境时,可以将 @SpringBootTest 改用 @ContextConfiguration 注解只加载所需配置,这样可以加速测试,下面例子是只需要 DemoConf 类的配置。当完全不需要 Spring 环境来测试时,还可以去掉 @RunWith 注解。

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = DemoConf.class)
public class DemoApplicationTests {
// ...
}

Spring Boot 解决方案 - JUnit 测试的更多相关文章

  1. Spring Boot集成Junit测试

    添加依赖: 在测试类上添加注解:

  2. Spring Boot应用的测试——Mockito

    Spring Boot应用的测试——Mockito Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试:Spring ...

  3. Spring Boot中的测试

    文章目录 简介 添加maven依赖 Repository测试 Service测试 测试Controller @SpringBootTest的集成测试 Spring Boot中的测试 简介 本篇文章我们 ...

  4. Spring Boot 整合Junit和redis

    14. Spring Boot整合-Junit 目标:在Spring Boot项目中使用Junit进行单元测试UserService的方法 分析: 添加启动器依赖spring-boot-starter ...

  5. spring boot项目如何测试,如何部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  6. Spring框架下Junit测试

    Spring框架下Junit测试 一.设置 1.1 目录 设置源码目录和测试目录,这样在设置产生测试方法时,会统一放到一个目录,如果没有设置测试目录,则不会产生测试代码. 1.2 增加配置文件 Res ...

  7. Spring Boot 1.4测试的改进

    对Pivotal团队来说,工作上的好事情是他们拥有一个被叫做Pivotal Labs的灵活发展部门,拥有Labs团队的Lean 和 XP程序设计方法学的强大支持,例如结对编程和测试驱动开发.他们对于测 ...

  8. Spring Boot 1.4测试的简单理解

    首先maven要引入spring-boot-starter-test这个包. 先看一段代码 @RunWith(SpringRunner.class) @SpringBootTest(webEnviro ...

  9. 如何使用Dubbo 2.7.0和Spring boot实现FAT测试(Feature Acceptance Test)

    在一个调用链非常长的功能中,如果想修改其中的一个特性,并进行测试,而又不影响该环境的其他用户使用现有功能.特性,例如: 1. A.B.C.D之间通过Dubbo实现远程调用 2. 这些模块可能有一个或者 ...

随机推荐

  1. Java数据库技术

    JDBC即Java数据库连接     是接口,用于执行SQL语句,包含Java写的类和界面.几乎可以把SQL传给任何数据库,不用单独编写SQL.     用处,1是与数据库建立连接,2是向数据库发送S ...

  2. Shell编程-09-Shell中的函数

    目录 基本语法 函数执行 函数示例     函数可以简化程序的代码量,达到更好的代码复用度,因此会让程序变得更加易读.简洁和易修改.其作用就是将需要多次使用的代码整合到一块,使其成为一个整体,然后通过 ...

  3. Curl工具的使用

      Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 工具下载 在官网处下载工具包:http:// ...

  4. codeforces 434D

    题意:有n<=50个点,每个点有xi有[li, ri]种取值,-100 <= li <= ri <= 100,并且给定m<=100条边,每条边为u,v,d表示xu< ...

  5. 查询指定网段可用IP脚

    方法一:linux命令 1.fping安装: yum install fping 2.fping使用: fping -g ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  6. 编写高质量iOS与OS X代码的52个有效方法

    第一章重点: 第一条:OC的起源 OC由smalltalk语言演化而来的语言为消息结构(messaging structure)语言,其运行时所因执行的的代码由运行环境来决定:函数调用(functio ...

  7. Implementation of WC in JAVA

    Implementation of WC in JAVA github地址 相关要求 基本功能 -c [文件名] 返回文件的字符数 (实现) -w [文件名] 返回文件的词的数目 (实现) -l [文 ...

  8. [javascript]jsonp-function 代码段

    (function($1454395832823,arr_infoList /**/) { $1454395832823.push(' '); for(var i in arr_infoList) { ...

  9. iOS AppIcon尺寸

    如果提交的ipa包中,未包含必要的Icon就会收到类似的通知,为什么偏偏是Icon-76呢? 因为我们开发的游戏,默认是支持iphone以及ipad的,根据官方提供的参考 Icon-76.png是必须 ...

  10. collaborative filtering协同过滤

    每次我想看电影的时候,都会去问我的朋友,小健.一般他推荐的电影,我都比较喜欢.显然不是所有人都有小健这样的能力.因为我碰巧和小健有类似的品味. 这个生活中的经验,实际上有着广泛的用途. 当系统需要为某 ...