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

Spring Boot中的单元测试

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

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

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

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

public class yanggbTest {
@Test
public void test1 () {
System.out.println("我是一个简单测试。");
}
}

自动注入servicei或dao报空指针异常的原因

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

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

如何注入service或dao

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

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

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RenjApplication.class)
public class yanggbTest {
  
}

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

@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)
@SpringBootTest(classes = RenjApplication.class)
public class yanggbTest {
@Autowried
RenjServiceImpl renjService; @Test
public void test1 () {
renjService.loveYanggb();
}
}

这样我们就能在测试类中愉快地调用service中的方法了,dao也是同样的。

"成熟的标志不是会说大道理,而是开始去理解身边的小事,去体谅周遭的不得已。"

spring boot测试类自动注入service或dao的更多相关文章

  1. Spring Boot @Autowired 没法自动注入的问题

    Application 启动类: @SpringBootApplication @EnableConfigurationProperties @ComponentScan(basePackages = ...

  2. SpringBoot中普通类无法通过@Autowired自动注入Service、dao等bean解决方法

    无法注入原因: 有的时候我们有一些类并不想注入Spring容器中,有Spring容器实例化,但是我们又想使用Spring容器中的一些对象,所以就只能借助工具类来获取了 工具类: package com ...

  3. spring boot 测试类

    import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.Logge ...

  4. 工具类中注入service和dao

    今天编写了个工具类需要用到service成和dao层的代码 如下: //第一步:需要将工具类注入到容器中 @Component public class RuleUtils { ​ //第二部注入 @ ...

  5. Spring框架中,在工具类或者普通Java类中调用service或dao

    spring注解的作用: 1.spring作用在类上的注解有@Component.@Responsity.@Service以及@Controller:而@Autowired和@Resource是用来修 ...

  6. Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...

  7. Quartz与Spring集成 Job如何自动注入Spring容器托管的对象

    在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类.很显然,第二种方式远比第一种方式来的 ...

  8. Spring Boot之配置文件值注入(@ConfigurationProperties)

    前言:Spring Boot配置文件值的注入有两种方式,分别是 @ConfigurationProperties @Value 这里我们使用第一种 首先我们创建一个application.yml文件, ...

  9. Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档

    0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...

随机推荐

  1. 训练DQN,报错:OSError: [Errno 12] Cannot allocate memory

    训练DQN,报错:OSError: [Errno 12] Cannot allocate memory 问题介绍: 这两天在做强化学习的作业,使用 DQN 打 Atari 游戏,但在训练过程中,出现了 ...

  2. C# - VS2019通过重写pictureBox实现简单的桌面截图功能

    前言 通过创建客制化组件(继承pictureBox),新增属性和构造方法,实现屏幕截图时需要用到的功能点.再通过监控鼠标按下.移动和释放,来获取起始点区域.最后通过操作BMP图像,实现截图的新增.修改 ...

  3. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之五 || Swagger的使用 3.3 JWT权限验证【必看】

    本文梯子 本文3.0版本文章 前言 1.如何给接口实现权限验证? 零.生成 Token 令牌 一.JWT ——自定义中间件 0.Swagger中开启JWT服务 1:API接口授权策略 2.自定义认证之 ...

  4. 这些好用却鲜为人知的Python库,你知道多少?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 读芯术 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  5. CAD制图初学入门教程:怎么在CAD中绘制箭头

    在接触CAD的时候大家有没有和小编一样感觉无所适从,所以下面就来和大家分享一个CAD制图初学入门教程,在CAD中绘制箭头.在CAD图形上进行标注内容的时候一般都会使用箭头来进行指示,那具体怎么在CAD ...

  6. Spring 注解配置Bean

    一.使用注解配置Bean 1.注解 在类定义.方法定义.成员变量定义前使用.其简化<bean>标签,功能同<bean>标签.格式为: @注解标记名. 2.组件扫描 Spring ...

  7. postgreSQL数据库的初探

    kali是黑客的强大武器,还有一个也是哦——Metasploit postgreSQL数据库是Metasploit的默认数据库哦! 启动postgresql: service postgresql s ...

  8. Android框架Volley之:ImageRequest请求实现图片加载

    首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: < ...

  9. Android MediaRecorder录制播放音频

    1.请求录制音频权限 <user-permission android:name="android.permission.RECORD_AUDIO"/> RECORD_ ...

  10. mssql 单引号插入到sqlserver的方法分享

    转自:http://www.maomao365.com/?p=6740 摘要: 下文讲述sqlserver操作中遇到单引号的处理方法sqlserver 数据库中可以存储任何字符,因为在数据库中字符都是 ...