目录

添加依赖与配置

ApplicationContext测试

Environment测试

MockBean测试

Controller测试

情况一

情况二

方法一

方法二


本文将对在Springboot中如何使用Junit进行单元测试进行简单示例和介绍,项目的完整目录层次如下图所示。

添加依赖与配置

为了保证测试的完整性,本工程POM文件中除引入Junit单元测试依赖外,还额外引入了用来测试JDBC和Controller的JPA和WEB依赖。

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version></parent><dependencies><!-- 添加MySQL依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 添加JDBC依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 引入单元测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

同时,在src/main/resources目录下添加核心配置文件application.properties,内容如下。

#########################################################
###  Spring DataSource  -- DataSource configuration   ###
#########################################################
spring.datasource.url=jdbc:mysql://localhost:3306/dev1?useUnicode=true&characterEncoding=utf8
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456#########################################################
### Java Persistence Api --  Spring jpa configuration ###
#########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy  #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

ApplicationContext测试

在Springboot中使用Junit进行单元测试的方法很简单,只需要在编写的单元测试类上添加两个注解:@RunWith(SpringRunner.class)和@SpringBootTest。

@RunWith(SpringRunner.class) // 等价于使用 @RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { MyApplication.class, TestConfig.class })
public class ApplicationContextTest {@Autowiredprivate ApplicationContext context;@Autowiredprivate UserDao userDao;@Testpublic void testUserDao() {userDao.addUser(18, "pengjunlee");}@Testpublic void testConfiguration() {Runnable bean = context.getBean(Runnable.class);Assert.assertNotNull(bean);bean.run();}}

UserDao定义如下。

@Repository
public class UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void addUser(Integer userAge, String userName) {String sql = "insert into tbl_user (age,name) values ('" + userAge + "','" + userName + "');";jdbcTemplate.execute(sql);}
}

TestConfig定义如下。

/*** @TestConfiguration注解的配置内的Bean仅在测试时装配*/
@TestConfiguration
public class TestConfig {@Beanpublic Runnable createRunnable(){return ()->{System.out.println("This is a test Runnable bean...");};}
}

提示:@SpringBootTest注解的classes可以指定用来加载Spring容器所使用的配置类,@TestConfiguration注解修饰的配置类内的Bean仅在测试的时候才会装配。

Environment测试

我们可以通过@SpringBootTest注解的properties属性向Environment中设置新的属性,也可以通过使用EnvironmentTestUtils工具类来向ConfigurableEnvironment中添加新的属性。

@RunWith(SpringRunner.class)
@SpringBootTest(properties = { "app.token=pengjunlee" })
public class EnvironmentTest {@Autowiredprivate Environment env;@Autowiredprivate ConfigurableEnvironment cenv;@Beforepublic void init() {EnvironmentTestUtils.addEnvironment(cenv, "app.secret=55a4b77eda");}@Testpublic void testEnvironment() {System.out.println(env.getProperty("spring.datasource.url"));Assert.assertEquals("pengjunlee", env.getProperty("app.token"));Assert.assertEquals("55a4b77eda", cenv.getProperty("app.secret"));}@Test@Ignore // 忽略测试方法public void testIgnore() {System.out.println("你看不见我...");}}

扩展:Junit测试用例执行顺序:@BeforeClass ==> @Before ==> @Test ==> @After ==> @AfterClass 。

注意:在使用Junit对Spring容器进行单元测试时,若在src/test/resources 目录下存在核心配置文件,Spring容器将会只加载src/test/resources 目录下的核心配置文件,而不再加载src/main/resources 目录下的核心配置文件。

MockBean测试

我们可以通过@MockBean注解来对那些未添加实现的接口进行模拟测试,预先设定好调用方法期待的返回值,然后再进行测试。

例如,有如下的IUserService接口,定义了一个getUserAge()方法用来根据用户的ID来查询用户的年龄。

public interface IUserService {Integer getUserAge(Long userId);}

使用@MockBean来对IUserService接口进行模拟测试,测试代码如下。

@RunWith(SpringRunner.class)
public class MockBeanTest {@MockBeanprivate IUserService userService;@SuppressWarnings("unchecked")@Test(expected = NullPointerException.class)public void testMockBean() {BDDMockito.given(userService.getUserAge(2L)).willReturn(Integer.valueOf(18));BDDMockito.given(userService.getUserAge(0L)).willReturn(Integer.valueOf(0));BDDMockito.given(userService.getUserAge(null)).willThrow(NullPointerException.class);Assert.assertEquals(Integer.valueOf(18), userService.getUserAge(2L));Assert.assertEquals(Integer.valueOf(0), userService.getUserAge(0L));Assert.assertEquals(Integer.valueOf(0), userService.getUserAge(null));}
}

Controller测试

在Springboot中可以通过TestRestTemplate和MockMvc来对Controller进行测试,有以下两种情况。

情况一

Controller中未装配任何其他Spring容器中的Bean,例如下面这个控制器。

@RestController
@RequestMapping("/user")
public class UserController01 {@GetMapping("/home")public String homeUser(@RequestParam(name = "name", required = true) String userName) {if (null == userName || userName.trim() == "") {return "you are nobody...";}return "This is " + userName + "'s home...";}
}

此时无需启动Spring容器,可直接使用MockMvc来对Controller进行模拟测试,测试代码如下。

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = { UserController01.class })
public class ControllerTest01 {@Autowiredprivate MockMvc mvc;@Testpublic void testAddUser() throws Exception {mvc.perform(MockMvcRequestBuilders.get("/user/home").param("name", "")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string("you are nobody..."));mvc.perform(MockMvcRequestBuilders.get("/user/home").param("name", "pengjunlee")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string("This is pengjunlee's home..."));}}

情况二

Controller中需装配其他Spring容器中的Bean,例如下面这个控制器。

@RestController
@RequestMapping("/user")
public class UserController02 {@Autowiredprivate UserDao userDao;@GetMapping("/add")public String addUser(@RequestParam(name = "age", required = false, defaultValue = "0") Integer userAge,@RequestParam(name = "name", required = true) String userName) {if (userAge <= 0 || null == userName || userName.trim() == "") {return "0";}userDao.addUser(userAge, userName);return "1";}}

此时除了要启动Spring容器,还需要启动内嵌的WEB环境,有以下两种方法。

方法一

利用TestRestTemplate进行测试。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ControllerTest02 {@Autowiredprivate TestRestTemplate template;@Testpublic void testAddUser() {String result1 = template.getForObject("/user/add?name=pengjunlee", String.class);Assert.assertEquals("0", result1);String result2 = template.getForObject("/user/add?age=20&name=Tracy", String.class);Assert.assertEquals("1", result2);}}

方法二

利用MockMvc进行测试。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class ControllerTest03 {@Autowiredprivate MockMvc mvc;@Testpublic void testAddUser() throws Exception {mvc.perform(MockMvcRequestBuilders.get("/user/add").param("name", "")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string("0"));mvc.perform(MockMvcRequestBuilders.get("/user/add").param("age", "22").param("name", "pengjunlee")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string("1"));}}

本文项目源码已上传至CSDN,资源地址:https://download.csdn.net/download/pengjunlee/10394302

SpringBoot重点详解--使用Junit进行单元测试相关推荐

  1. SpringBoot重点详解--事件监听

    目录 自定义事件监听 Springboot 启动事件监听 Springboot 事件监听为 Bean 与 Bean 之间的消息通信提供支持:当一个 Bean 做完一件事以后,通知另一个 Bean 知晓 ...

  2. SpringBoot重点详解--整合hive-jdbc

    目录 添加依赖与配置 配置数据源与JdbcTemplate 使用DataSource操作 Hive 使用 JdbcTemplate 操作 Hive 启动测试 创建Hive表 查看Hive表 导入数据 ...

  3. SpringBoot重点详解--使用过滤器映射访问路径

    目录 添加Maven依赖 配置地址映射 MapsApplication应用启动类 MapsInitializeListener初始化监听器 MapsUtils工具类 MapsFilter过滤器 Map ...

  4. SpringBoot重点详解--dbcp2数据源配置

    目录 DBCP2详细的配置表 常用链接配置 数据源连接数量配置 事务属性配置 数据源连接健康状况检查 缓存语句 连接泄露回收 DBCP2详细的配置表 常用链接配置 参数 描述 username 传递给 ...

  5. SpringBoot重点详解--@JoinColumn注解

    目录 @OneToOne(一对一) @OneToMany(一对多) @ManyToOne(多对一) @ManyToMany(多对多) @JoinColumn 注解的作用:用来指定与所操作实体或实体集合 ...

  6. SpringBoot重点详解--log4j.properties配置详解与实例

    ################################################################################ #①配置根Logger,其语法为: # ...

  7. SpringBoot @ConfigurationProperties详解

    文章目录 简介 添加依赖关系 一个简单的例子 属性嵌套 @ConfigurationProperties和@Bean 属性验证 属性转换 自定义Converter SpringBoot @Config ...

  8. spring-boot注解详解(一)

    spring-boot注解详解(一) @SpringBootApplication @SpringBootApplication = (默认属性)@Configuration + @EnableAut ...

  9. 【SpringBoot 】SpringBoot注解详解

    [SpringBoot ]SpringBoot注解详解 一.注解(annotations)列表  @SpringBootApplication:包含了@ComponentScan.@Configura ...

最新文章

  1. 使用java代码代替xml实现SSM
  2. 做项目经理到底有多爽?
  3. 报错android.view.InflateException: Binary XML file line #11: Attempt to invoke virtual method 'boolean
  4. matlab绘制离散数据图
  5. Linux 磁盘与文件系统管理
  6. 首发:李航老师的《统计学习方法》第二版的代码实现(Github标星过万!)
  7. VTK:标记数据映射器用法实战
  8. MySQL安装错误:/usr/local/mysql/libexec/mysqld: unknown option '--skip-federated'
  9. 多源异构数据_构建数字孪生城市的CIM数据平台哪家强?
  10. [转]Linux下VSCode常用的快捷键
  11. 可能是数据最全的世界各国地区下拉级联,包含国际化中英文
  12. Python 调用IDM下载器
  13. 3dmax渲染是用云渲染好还是自己电脑渲染好?
  14. 二,变量(variable)
  15. Android禁用系统更新
  16. NVR(网络硬盘录像机)以及其他相近名词DVR、DVS、NVS
  17. 区块链软件开发公司 区块链带给信贷行业的优势
  18. SaaS,iass 和pass,你知道吗?
  19. 云存储数据安全研究,主要集中在哪几个方面?
  20. 冷存储王者,磁带当仁不让,减碳共识下的企业优选

热门文章

  1. vue-element-admin 左侧菜单增加可拉伸收缩
  2. 一个简单的宏病毒制作过程
  3. linux学习(超全)
  4. 关于MPAndroidChart BarChart 柱状图组遇到的一些问题记录。
  5. 从零开始学习C语言(4)
  6. 虚幻引擎(23)-游戏背景音乐
  7. 国外前端网站开发的网站
  8. Lake Counting【POJ2386】
  9. 使用Python制作学习英语软件
  10. 【AI达人创造营三期】Jetson Nano实时监测学生坐姿,预防近视