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操作(有详细的分析过程)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
Spring Cloud 中@FeignClient注解中的contextId属性详解
这篇文章主要介绍了Spring Cloud 中@FeignClient注解中的contextId属性详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-25Springboot如何实现Web系统License授权认证
这篇文章主要介绍了Springboot如何实现Web系统License授权认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-28- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
如何在Spring WebFlux的任何地方获取Request对象
这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了详解SpringCloudGateway内存泄漏问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-16
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- @Autowired 注解的主要功能就是完成自动注入,使用也非常简单,但这篇文章主要给大家介绍了关于Spring为什么不推荐使用@Autowired注解的相关资料,需要的朋友可以参考下...2021-11-03