java spring整合junit操作(有详细的分析过程)

此博客解决了什么问题:

解决测试的时候代码冗余的问题,解决了测试工程师的编码能力可能没有开发工程师编码能力的问题,解决了junit单元测试和spring注解相结合!

测试类代码:(只给大家展示测试类的代码)

public class AccountServiceTest {
 @Test
 public void testFindAll(){
  //1.获取容器
  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
  //2.得到业务层对象
  IAccountService as =ac.getBean("accountService",IAccountService.class);
  //3.执行方法
   List<Account> accounts=as.findAllAccount();
   for(Account account:accounts){
    System.out.println(account);
   }
 }

 @Test
 public void testFindSave(){
  Account account=new Account();
  account.setMoney(20000f);
  account.setName("test");
  //1.获取容器
  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
  //2.得到业务层对象
  IAccountService as =ac.getBean("accountService",IAccountService.class);
  as.saveAccount(account);
 }
 @Test
 public void testFindUpdate(){
  Account account=new Account();

  //1.获取容器
  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
  //2.得到业务层对象
  IAccountService as =ac.getBean("accountService",IAccountService.class);
  account=as.findAccountById(4);
   account.setMoney(40000f);
  as.updateAccount(account);
 }
}

以上的代码都有公共的地方:

 //1.获取容器
 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
 //2.得到业务层对象
 IAccountService as =ac.getBean("accountService",IAccountService.class);

此时为了减少代码的冗余我们完全可以将其抽离出来,如下:

 private ApplicationContext ac;
 private IAccountService as;

 @Before
 public void init(){
  //1.获取容器
   ac=new ClassPathXmlApplicationContext("bean.xml");
  //2.得到业务层对象
   as =ac.getBean("accountService",IAccountService.class);
 }

 @Test
 public void testFindAll(){

  //3.执行方法
   List<Account> accounts=as.findAllAccount();
   for(Account account:accounts){
    System.out.println(account);
   }
 }
 @Test
 public void testFindSave(){
  Account account=new Account();
  account.setMoney(20000f);
  account.setName("test");
  as.saveAccount(account);
 }
 @Test
 public void testFindUpdate(){
  Account account=new Account();
  account=as.findAccountById(4);
   account.setMoney(40000f);
  as.updateAccount(account);
 }

上面的代码似乎解决了我们的问题,但是我们忽略了一个问题,就是说在软件开发的过程中,这是两个角色,开发代码的是软件开发工程师,而这个测试的为软件测试工程师,对于测试人员只管方法能不能执行,性能怎么样,上面抽离出的代码测试人员不一定会写!

 private ApplicationContext ac;
 private IAccountService as;

 @Before
 public void init(){
  //1.获取容器
   ac=new ClassPathXmlApplicationContext("bean.xml");
  //2.得到业务层对象
   as =ac.getBean("accountService",IAccountService.class);
 }

分析:

首先我们先明确三点:

1.一般应用程序的入口都有main方法,但是在junit单元测试中,没有main方法也能执行,junit集成了一个main方法,该方法就会判断当前测试类中 是否有@test注解,然后让带着Test注解的类执行。

2、junit不会管我们是否采用spring框架,在执行测试方法时,junit根本不知道我们是不是使用了spring框架,所以也就不会为我们读取配置文件/配置类创建spring核心容器

3.当测试方法执行时,没有Ioc容器,就算写了Autowired注解,也无法实现注入

综上所述:按照我们之前的Autowried注入已经不好使了!接下看解决办法:

1.导入spring整合junit的jar(坐标)

  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-test</artifactId>
   <version>5.0.2.RELEASE</version>
  </dependency>

2.使用junit提供的一个注解把原有的main方法替换了,替换成spring提供的,

这个注解是@RunWith,然后网上有这样的解释,我觉得比较贴切:

@RunWith就是一个运行器

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

@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境,以便在测试开始的时候自动创建Spring的应用上下文

注解了@RunWith就可以直接使用spring容器,直接使用@Test注解,不用启动spring容器

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

3.告知spring的运行器,spring创建是基于xml还是注解的,并说明位置

这个注解就是:@ContextConfiguration

locations:指定xml文件的位置,加上classpath关键字,表示在类路径下

classes: 指定注解类所在地位置

当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)

public class AccountServiceTest {
 @Autowired
 private IAccountService accountService;

 @Test
 public void testFindAll() {
  //3.执行方法
  List<Account> accounts = accountService.findAllAccount();
  for(Account account : accounts){
   System.out.println(account);
  }
 }

 @Test
 public void testSave() {
  Account account = new Account();
  account.setName("test anno");
  account.setMoney(12345f);
  //3.执行方法
  accountService.saveAccount(account);
 }

 @Test
 public void testUpdate() {
  //3.执行方法
  Account account = accountService.findAccountById(4);
  account.setMoney(23456f);
  accountService.updateAccount(account);
 }
}

补充知识:idea Could not autowire. No beans of 'XXXX' type found.

如下图:在使用@Autowired注解的时候,提示找不到bean类型,查找了半天错误,发现这就不是错误,因为它根本不会影响程序的运行! 此时我以为是我的Service层注解没写,可是明明写了!看下面的解决办法!

解决办法:

点击文件–setting–Editor–Inspections–spring–Warning–Apply–OK

以上这篇java spring整合junit操作(有详细的分析过程)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring JdbcTemplate整合使用方法及原理详解

    基本配置 JdbcTemplate基本用法实际上很简单,开发者在创建一个SpringBoot项目时,除了选择基本的Web依赖,再记得选上Jdbc依赖,以及数据库驱动依赖即可,如下: 项目创建成功之后,记得添加Druid数据库连接池依赖(注意这里可以添加专门为Spring Boot打造的druid-spring-boot-starter,而不是我们一般在SSM中添加的Druid),所有添加的依赖如下: <dependency> <groupId>com.alibaba</gro

  • SpringBoot2种单元测试方法解析

    一 普通测试类 当有一个测试方法的时候,直接运行. 要在方法前后做事情,可以用before或者after. 假如有多个方法运行,则可以选择类进行运行. @RunWith(SpringRunner.class) @SpringBootTest public class TestApplicationTests { @Test public void testOne(){ System.out.println("test hello 1"); TestCase.assertEquals(1

  • 启动Spring项目详细过程(小结)

    1.Spring 项目放到web项目容器中(Tomcat.Jetty.JBoss) 本文以通用的Tomcat为例 2.项目容器启动时需要加载读取web.xml配置文件 如下图: 3.容器首先会去读取web.xml配置文件中的两个节点:<listener> </listener>和<context-param> </context-param> 说明: tomcat在启动web容器的时候会启动一个叫ServletContextListener的监听器,每当在w

  • 详解Spring Boot Junit单元测试

    Junit这种老技术,现在又拿出来说,不为别的,某种程度上来说,更是为了要说明它在项目中的重要性. 凭本人的感觉和经验来说,在项目中完全按标准都写Junit用例覆盖大部分业务代码的,应该不会超过一半. 刚好前段时间写了一些关于SpringBoot的帖子,正好现在把Junit再拿出来从几个方面再说一下,也算是给一些新手参考了. 那么先简单说一下为什么要写测试用例 1. 可以避免测试点的遗漏,为了更好的进行测试,可以提高测试效率 2. 可以自动测试,可以在项目打包前进行测试校验 3. 可以及时发现因

  • java spring整合junit操作(有详细的分析过程)

    此博客解决了什么问题: 解决测试的时候代码冗余的问题,解决了测试工程师的编码能力可能没有开发工程师编码能力的问题,解决了junit单元测试和spring注解相结合! 测试类代码:(只给大家展示测试类的代码) public class AccountServiceTest { @Test public void testFindAll(){ //1.获取容器 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml&quo

  • Spring整合junit的配置过程图解

    配置步骤: 1.导入Spring整合Junit的jar(坐标): <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.2.RELEASE</version> <scope>test</scope> </dependency> 2.使用Ju

  • Spring整合Junit详解

    目录 1,整合Junit4 2,整合Junit5 1,整合Junit4 maven引入spring-test 和 junit4 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.22.RELEASE</version> </dependency> <de

  • Java Spring Boot消息服务万字详解分析

    目录 消息服务概述 为什么要使用消息服务 异步处理 应用解耦 流量削峰 分布式事务管理 常用消息中间件介绍 ActiveMQ RabbitMQ RocketMQ RabbitMQ消息中间件 RabbitMQ简介 RabbitMQ工作模式介绍 Work queues(工作队列模式) Public/Subscribe(发布订阅模式) Routing(路由模式) Topics(通配符模式) RPC Headers RabbitMQ安装以及整合环境搭建 安装RabbitMQ 下载RabbitMQ 安装R

  • spring 整合kafka监听消费的配置过程

    前言 最近项目里有个需求,要消费kafka里的数据.之前也手动写过代码去消费kafka数据.但是转念一想.既然spring提供了消费kafka的方法.就没必要再去重复造轮子.于是尝试使用spring的API. 项目技术背景,使用springMVC,XML配置和注解相互使用.kafka的配置都是使用XML方式. 整合过程 1. 引入spring-kafka的依赖包 <dependency> <groupId>org.springframework.kafka</groupId&

  • 使用Spring Boot实现操作数据库的接口的过程

    一.Spring Boot原理 用户从页面前端,也就是我们所说的 view 层进行查询访问,进入到 controller 层找到对应的接口,接 着 controller 进行对 service 层进行业务功能的调用,service 要进入 dao 层查询数据,dao 层调用 mapper.xml 文件生成 sql 语句到数据库中进行查询 二.实现过程 2.1.准备数据库user表插入四条数据 2.2.model下创建一个User类 与数据库的字段一一对应 @Getter @Setter publ

  • Spring整合Junit的使用详解

    我们在编写完Spring的代码后,往往需要测试代码的正确性,这个时候就需要用到单元测试了.我们这里使用的版本是junit4. 一个程序的入口是main方法,但是junit中不存在main方法,是因为junit内部的原理是它自己内部就有个main方法,运行扫描带@Test注解的方法,然后反射调用该方法,完成测试. 调用Spring框架的测试代码: @Test public void function(){ ApplicationContext applicationContext = new Cl

  • SSM框架中测试单元的使用 spring整合Junit过程详解

    测试类中的问题和解决思路 问题 在测试类中,每个测试方法都有以下两行代码: ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); IAccountService as = ac.getBean("accountService",IAccountService.class); 这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常.所以又不能轻易删掉. 解决思路分析 针对

  • java Spring松耦合高效应用简单实例分析

    java Spring松耦合 面向对象的概念,是一个很好的设计来打破系统进入一个组可重用的对象.然而,当系统变大,尤其是在Java项目,庞大的对象依赖关系将一直紧密耦合引起对象难以管理或修改.在这种情况下,可以使用Spring框架作为一个核心模块轻松高效地管理所有的对象依赖. 输出生成器的例子 让我们来看一个例子,假设你的项目有一个函数输出的内容,以CSV或JSON格式.您的代码可能看起来像下面的例子: File : IOutputGenerator.java – 输出生成器接口 package

  • java Spring整合Freemarker的详细步骤

    我的開發環境框架:springmvc開發工具:springsource-tool-suite-2.9.0版本:1.6.0_29tomcat版本:apache-tomcat-7.0.26前言:FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等.簡而言之,Freemarker就是在Jave Web開發

随机推荐