Spring整合Junit的使用详解
作者:Jokeronee 发布时间:2022-11-20 18:33:17
我们在编写完Spring的代码后,往往需要测试代码的正确性,这个时候就需要用到单元测试了。我们这里使用的版本是junit4.
一个程序的入口是main方法,但是junit中不存在main方法,是因为junit内部的原理是它自己内部就有个main方法,运行扫描带@Test注解的方法,然后反射调用该方法,完成测试。
调用Spring框架的测试代码:
@Test
public void function(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
AccountDao accountDao1 = applicationContext.getBean("AccountDao", AccountDao.class);
accountDao1.findAll();
}
我们发现这只是查询,还有增删改方法没有测试,但是这几个测试都有重复代码块,我们应该把它们抽取出来
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
AccountDao accountDao1 = applicationContext.getBean("AccountDao", AccountDao.class);
我们可以在外面定义一个全局变量,用来存储accountDao的值,并且通过@Autowired注解实现注入对象,这样每个方法就都可以使用它了.
@Autowired
private AccountDao accountDao;
但是这样运行之后会爆出空指针异常!!!
这是因为Junit默认是不认识Spring框架的,所以它内部没有IOC容器,这样就算你有@Autowired这个注解,它也不知道从哪里注入数据,所以就会有这个异常。
问题原因分析出来后,我们就想,能不能自己提供一个IOC容器呢,即
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
往往在现实开发中,软件开发和软件测试是两个职位,上述代码如果是开发编写的话,往往没什么问题。但测试人员可能会不懂Spring的代码,所以需要另外一种办法,好在Spring为我们提供了整合Junit的使用。
首先引入Spring-test的jar坐标
<dependency>
<groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.5.RELEASE</version>
<scope>test</scope>
</dependency>
Spring给我们提供了一个main方法,这个main方法支持Spring框架,我们用这个main替换Junit的main方法。
@RunWith(SpringJUnit4ClassRunner.class)
在类上加上这个注解,@Runwith代表要替换的运行器,后面在字节码参数
告诉Spring配置文件/配置类的位置
@ContextConfiguration(locations = "classpath:bean.xml")
使用Contextfiguration注解可以完成该功能,locations表示配置文件的位置,加上classpath表示类路径。
至此整合结束,测试方法直接使用既可,但是这里有个版本问题,如果你使用的是Spring5.0以上的话,你的Junit版本必须是4.12以上!!!
不然会曝出
java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
这个错误
改完版本就可以正常运行测试方法了。
来源:https://blog.csdn.net/Jokeronee/article/details/104194401


猜你喜欢
- 什么是AOPAOP是Aspect Oriented Programming的缩写,即『面向切面编程』。它和我们平时接触到的OOP都是编程的不
- 本文实例为大家分享了java实现小超市程序的具体代码,供大家参考,具体内容如下一.人物包1.顾客类package person;public
- 在上篇文章给大家介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结,如果大家有需要可以参考下。$和#简单说明:#相当于对数据
- 本文实例为大家分享了java制作简单验证码的具体代码,供大家参考,具体内容如下在这里我们需要用到java的画笔工具,所以我们需要导入以下包i
- 枚举的定义1.题目枚举是JAVA 5.0后增加的一个重要类型。可以用来表示一组取值范围固定的变量。使用enum关键字,可以定义枚举类型。实现
- 前言继上次文章C# 初识Picture控件,今天我们来学一下PictureBox的方法以及一些基本操作,对于图片的删除,上传以及重命名,之前
- 去年谷歌 I/O大会上介绍了一个非常厉害的新框架DataBinding, 数据绑定框架给我们带来了很大的方便,以前我们可能需要在每个Acti
- 原理概述Lifecycle主要用于Activity、Fragment这一类具有状态的组件的状态监听,最主要的一个作用就是将原先Activit
- 看到题目后,分析了下, 10的阶乘就已经很大了。计算出来再得到这个末尾的0的个数,完全不现实,即使实现了也是很麻烦的。后来想某个数的阶乘中乘
- 本文实例为大家分享了java实现顶一下踩一下功能的具体代码,供大家参考,具体内容如下效果图如下:主页面index.html:<!DOC
- 在Maven工程里运行Java main方法mvn compilemvn exec:java -Dexec.mainClass="
- 使用例子如下,用JAVA 运行Sort1, 输入你要排序的文件路径 , 如 例子是对H:\下的文件和它所有子文件夹下的文件进行排序2, 输入
- 引言在前面的内容中,我们先是一一介绍了Collection集合中都有哪些种类的集合,并且详细地讲解了List集合中的相关知识,那么今天我们来
- Gradle 属性( Gradle build environment)[详细信息]("https://docs.gradle.o
- 一、基本特点1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁
- 简介:本文将帮助您使用 Spring Boot 创建简单的 REST 服务。你将学习什么是 REST 服务?如何使用 Spring Init
- 目录为什么要用Geometry数据做图标?怎么获取Geometry数据?如何使用Geometry数据相信大家在阅读WPF相关GitHub开源
- public void ProcessRequest (HttpContext context) { &n
- 本文实例讲述了C#访问SqlServer设置链接超时的方法。分享给大家供大家参考。具体实现方法如下:下面这段代码设置超时时间为60秒,默认为
- 前言在使用IDEA2020.2.3版本时,创建web工程遇到了一些问题,经过一番摸索之后得到解决方案。一、新建javaweb工程1.先创建一