SpringBoot测试Service或者Dao层

Stella981
• 阅读 703

SpringBoot测试Service或者Dao层

使用Spring Boot进行单元测试时,发现使用@Autowired注解的类无法自动注入,当使用这个类的实例的时候,报出NullPointerException,即空指针异常。

Spring Boot中的单元测试

先简单说一下Spring Boot中的单元测试。

要在Spring Boot中使用单元测试是很简单的,Spring Boot提供了spring-boot-starter-test的依赖,即JUnit的相关依赖。

  1. 在pom.xml文件中引入依赖:

  2. 单元测试的语法也很简单,使用@Test注解在方法上或在类上就可以进行简单的单元测试了。

    public class aquanTest {

自动注入serviceidao报空指针异常的原因

说回在JUnit单元测试类中自动注入serviceidao为什么会报空指针异常,报错的原因很明显是 @Autowired 自动注入注解没有成功将类的实例注入。

我们知道,在Spring中,类的实例是交给容器管理的,而在测试类中,容器因为没有相应的上下文环境,是没有办法找到相应的类并进行相应的初始化/实例化操作,因此也就没有在测试类中成功注入类的实例,在试图使用类的实例的情况下也就会报空指针异常的错误。

如何注入serviceidao

根据上面的分析,如果要注入serviceidao的话,我们需要给容器构建一个上下文环境,这里具体是Spring Boot的运行环境。

我们可以通过在测试类上添加两个注解来实现构建上下文环境的效果。

@RunWith(SpringRunner.class)

我们从注解的命名上就可以看出其功能,但这里还是简单介绍一下。

@RunWith注解

@RunWith注解是类级别的注解, 它提供了一种更改测试运行程序的默认行为的机制。简单理解,@RunWith注解就是一个运行器,其接受一个类的签名来指定是使用什么类、在什么环境下运行。需要注意的是,该注解的参数必须是Runner类的子类,JUnit本身有提供几个Runner,默认值为JUnit4,一个常见的替代方法是参数化类。

当使用@RunWith注解对JUnit测试进行注解时,将对测试的生命周期和测试的运行方式进行一些更改。

比如@RunWith(JUnit4.class)就是指用JUnit4来运行。

比如@RunWith(SpringJUnit4ClassRunner.class)就是让测试运行于Spring测试环境。

比如@RunWith(Suite.class)的话就是一套测试集合。

比如@RunWith(SpringJUnit4ClassRunner.class)使用了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候自动创建Spring的应用上下文。一般情况下想创建spring容器的话,需要通过web.xml配置classloder,但如果注解了@RunWith注解的话,就可以直接使用spring容器,直接使用@Test注解,不用启动spring容器。

在上面的代码中,使用了@RunWith(SpringRunner.class),实际上,SpringRunner类就是继承于Spring的SpringJUnit4ClassRunner类。

@SpringBootTest注解

@SpringBootTest注解是一个Spring Boot提供的注解,通过这个注解可以使JUnit单元测试跑在Spring Boot的运行环境中。

我们可以通过classes参数来指定Spring Boot的启动类。

栗子:

最后我们来看一个完整的、在测试类中注入service的示例。

@RunWith(SpringRunner.class)

SpringBoot测试Service或者Dao层

SpringBoot测试Service或者Dao层

本文分享自微信公众号 - 爱敲代码的猫(aquanrun)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
SpringBoot测试Service或者Dao层
!(https://oscimg.oschina.net/oscnet/3617716e29864749803145ac057d5c11f0c.gif)使用SpringBoot进行单元测试时,发现使用@Autowired注解的类无法自动注入,当使用这个类的实例的时候,报出NullPointerException,即空指针
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这