当前位置: 首页 > news >正文

一键搭建网站windowswordpress修改数据库

一键搭建网站windows,wordpress修改数据库,深圳网站设计制作元,网站制作的基本步骤文章目录 前言一、使用最佳实践使用场景SpyBean失效场景解决Mock失效的问题避免FactoryBean的实现方式使用MockBean,但是要指定name 个人推荐 二、原理1. MockBean2.SpyBean方法调用 总结 前言 相信看我博客的都是javaer,工作中一般都是使用Springboot框…

文章目录

  • 前言
  • 一、使用
    • 最佳实践
    • 使用场景
    • @SpyBean失效场景
    • 解决Mock失效的问题
      • 避免FactoryBean的实现方式
      • 使用@MockBean,但是要指定name
    • 个人推荐
  • 二、原理
    • 1. @MockBean
    • 2.@SpyBean
    • 方法调用
  • 总结


前言

相信看我博客的都是javaer,工作中一般都是使用Springboot框架。
之前介绍过,可以利用@Transactional注解实现单测方法回滚,其实大家都知道Springboot-Test里面集成了Mockito,今天我们来介绍下怎么使用,以及原理是什么。


一、使用

最佳实践

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationLoader.class)
public abstract class BaseTest {@SpyBeanprotected EcmsGateway ecmsGateway;// 注意这行,是数据库查询的mapper,需要配置name属性。@MockBean(name = "basicUserInfoPOExtMapper")protected BasicUserInfoPOExtMapper basicUserInfoPOExtMapper;}@Before@SneakyThrows //这个是lombok的注解,还是挺好用的public void init() {
Mockito.doReturn(Collections.singletonList(userInfoPO)).when(basicUserInfoPOExtMapper).listBasicUserInfo();
Mockito.doReturn(Collections.singletonList(contractBaseInfo)).when(ecmsGateway).queryMainContractList(Mockito.anyList());}

**注意mybatis的mapper必须使用@MockBean注解,且必须配置name属性。**但是也因此导致该mapper作用域下的所有方法如果没有指定返回范式,就会返回空对象。

使用逻辑也很简单,就是通过MockBean和SpyBean对spring容器里注入的bean进行改造,然后在方法执行之前,通过Mockito的方法来指定当方法运行时,mock返回值。
需要注意的是
MockBean注解注入的属性,所有的方法调用,只要不指定返回范式和Mock对象,都是返回一个空的数据,null或者空的容器;而SpyBean注解注入的属性,默认方法调用还是走真实的链路调用,只有指定了返回范式的调用才会返回Mock的数据。

使用场景

一般情况下,咱们需要mock数据的场景是对于RPC调用,或者数据库查询(当然这个其实也是一种RPC)调用。
需要注意,很多同学发现Mock数据库查询会失效,具体原因和下面的是同一种情况!!!

@SpyBean失效场景

通过FactoryBean返回的对象类型是一个proxy时

Caused by: org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class com.sun.proxy.$Proxy146
注意这句报错!!!!!!
Mockito cannot mock/spy because :- final classat org.springframework.boot.test.mock.mockito.SpyDefinition.createSpy(SpyDefinition.java:103)at org.springframework.boot.test.mock.mockito.MockitoPostProcessor.createSpyIfNecessary(MockitoPostProcessor.java:358)at org.springframework.boot.test.mock.mockito.MockitoPostProcessor$SpyPostProcessor.createSpyIfNecessary(MockitoPostProcessor.java:496)at org.springframework.boot.test.mock.mockito.MockitoPostProcessor$SpyPostProcessor.postProcessAfterInitialization(MockitoPostProcessor.java:492)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:431)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1836)at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)... 106 more

解决Mock失效的问题

避免FactoryBean的实现方式

目前mybatis针对poMapper的实现都是通过MapperFactoryBean实现的,所以,最简单的方式,可以基于mapper封装repository层,然后对repository层的对象添加@MockBean或者@SpyBean,进行调用。
譬如:

@Repository
public class BasicUserInfoRepository implements IBasicUserInfoRepository {@Resourceprivate BasicUserInfoPOExtMapper basicUserInfoPOExtMapper;
}@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringBootStudyApplication.class)
public class BaseTest {@SpyBeanprotected IBasicUserInfoRepository iBasicUserInfoRepository;}

使用@MockBean,但是要指定name

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = SpringBootStudyApplication.class)
public class BaseTest {@MockBean(name = "basicUserInfoPOExtMapper")protected BasicUserInfoPOExtMapper basicUserInfoPOExtMapper;}

个人推荐

其实针对查询数据库的场景,个人还是推荐通过@Transactional注解达到数据回滚来实现查询数据的诉求,毕竟要是通过对poMapper添加@MockBean使得数据库查询能够Mock,但是由此导致了该poMapper的所有方法都需要指定返回范式。实例如下:

   @Transactional@Testpublic void testReceive() {// 前置将任务状态修改Long jobId = 255L;SePriceJob priceJob = new SePriceJob();priceJob.setId(jobId);priceJob.setAcceptType(JobAcceptType.CREATE_SUPPLIER_MAKE_UP.getAcceptType());priceJob.setStatus(PriceJobStatus.DONE.getStatus());priceJob.setTaskStatus(PriceJobTaskStatus.PROCESSING.getStatus());priceJobMapper.updateByPrimaryKeySelective(priceJob, SePriceJob.Column.acceptType, SePriceJob.Column.status, SePriceJob.Column.taskStatus);List<SePriceJob> priceJobList = priceJobMapper.selectByExample(SePriceJobExample.newAndCreateCriteria().andIdEqualTo(jobId).example());assert priceJobList.get(0).getTaskStatus().equals(PriceJobTaskStatus.PROCESSING.getStatus());}

二、原理

1. @MockBean

@MockBean注解的实现原理
需要注意的是MockBean有时候需要指定name属性,否则默认注入到Spring容器中的对象beanName是类的全限定名,导致其他bean在注入的时候获取到的不是该mockBean。

2.@SpyBean

@SpyBean注解对于原本bean是通过FactoryBean添加到容器,且被proxy过的实例,是没法实现Mock的。
@SpyBean注解的实现原理
可以看到不管是@MockBean还是@SpyBean,都是给spring的bean创建增加一个MockMethodInterceptor。
区别在于

1. @MockBean创建的mock对象是直接new出来的,而且只有MockMethodInterceptor这一个advisor;而@SpyBean是通过给spring容器创建的对象增加一个advisor:MockMethodInterceptor
2. 那MockMethodInterceptor在执行的时候是怎么区分当前对象到底是@MockBean还是@SpyBean修饰呢?MockMethodInterceptor对象有个属性MockCreationSettings mockCreationSettings,它有个属性defaultAnswer。@MockBean指定了该属性为Answers.RETURNS_DEFAULTS,而@SpyBean通过MockitoPostProcessor的createSpyIfNecessary,给指定的取值是Mockito.CALLS_REAL_METHODS

方法调用

方法调用的源码就不贴了,简单来说就是给MockMethodInterceptor实例增加一个返回范式,譬如创建一个matcher,指定该matcher命中时,返回某个对象;实际运行时,通过匹配matcher来决定是否返回Mock结果。


总结

  1. 文章主要讲了Springboot中的@MockBean和@SpyBean的使用场景和简单原理。
  2. 大家使用数据库一般都是通过spring-mybatis将mapper注入到spring容器的,导致使用@SpyBean不会生效,推荐使用@MockBean,同时指定name属性来实现数据库查询的返回Mock。当然笔者更推荐大家使用@Transactional注解实现回滚来达到数据库查询结果的设置。
http://www.yayakq.cn/news/680516/

相关文章:

  • 龙岗区住房和建设局在线网站建设投资平台网站
  • 制作网站基本步骤网络维护好学吗
  • 自己怎么做彩票网站网站添加可信任站点怎么做
  • 28网站制作高端网站开发
  • 设计素材网站上的素材可以商用吗建设部网站拆除资质
  • wordpress 安卓手机写厦门seo网站
  • 如何做自己的业务网站婺源网站建设
  • 北京手机网站开发电话wordpress空间转移
  • 番禺做网站的公司中级经济师考试成绩查询
  • 网站投放广告多少钱那个网站做的好
  • 电子商务平台网站建设厦门建设局领导
  • 7黄页网站建设网站新媒体建设方案
  • 集团网站建设多少钱wordpress即时聊天插件
  • wordpress做的网站wordpress 内容编辑
  • 四川监理协会建设网站网站关键词设置技巧
  • 建网站备案需要的材料wordpress弹框
  • 想建设个人网站去那里建设个人网站备案资料
  • 合肥市门户网站教学类网站怎么做
  • 免费网站看v片在线第一次做2017常用的网站
  • 相册管理网站模板下载失败小程序开发平台新参考价格
  • 知名网站用的技术文档管理系统
  • 网站审批wordpress 在线教育模板
  • ps做网站难吗淘宝客网站做的好的
  • 网站建设 实训意见和建议这种资源网站怎么做才赚钱
  • 做微信网站公司名称塘沽网红餐厅
  • 中国网站建设网页设计工商注册查询公司名称
  • 设计网站推荐ps公司变更流程
  • 任何做网站易企秀类似的软件
  • 普通网站制作wordpress qq头像
  • 网站提示危险网站怎么做网页游戏平台