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

织梦网站数据库库直接上传的 没有后台备份 需要怎么还原appstore下载安卓版

织梦网站数据库库直接上传的 没有后台备份 需要怎么还原,appstore下载安卓版,wordpress导入网站模板,百度关键词排名原理一:单元测试的特点 配合断言使用(可以杜绝System.out)可以重复执行不依赖环境不会对数据产生影响spring的上下文环境不是必须的一般都需要配合mock类框架来实现 二:常用的mock类框架 mockito 官网:Mockito framew…

一:单元测试的特点

  • 配合断言使用(可以杜绝System.out)
  • 可以重复执行
  • 不依赖环境
  • 不会对数据产生影响
  • spring的上下文环境不是必须的
  • 一般都需要配合mock类框架来实现

二:常用的mock类框架 

mockito

官网:Mockito framework site

另外现在像powermock和JMockito现在都不常用了;

三:Mockito的单独使用

(1)mock对象和spy对象

方法插桩

方法不插桩

作用对象

最佳实践

mock

执行插桩逻辑

返回mock对象的默认值

类、接口

被测试类或其依赖

spy

执行插桩逻辑

调用真实方法

类、接口

被测试类

(2)初始化mock/spy对象的方式

方法一

方法二

方法三

junit4

@RunWith(MockitoJUnitRunner.class)+@Mock等注解

Mockito.mock(X.class)等静态方法

MockitoAnnotations.openMocks(this)+@Mock等注解

junit5

@ExtendWith(MockitoExtension.class)+@Mock等注解

 四:具体实例操作

Controller层:

@Slf4j
@RestController
@Validated
public class UserController{@Resourceprivate UserService userService;@GetMapping("/selectById")public UserVO selectById(@NotNull Long userId){return userService.selectById(userId);}@PostMapping("/add")public String add(@RequestBody @Validated UserAddReq addReq){userService.add(addReq.getUsername(),addReq.getPhone(),addReq.getfeatures());return ok;}
}

方法一:@ExtendWith(MockitoExtension.class)+@Mock等注解

@ExtendWith(MockitoExtension.class)
public class InitMockSpyMethod1{@mockprivate UserService mockUserService;@Spyprivate UserService spyUserService;@Testpublic void test1(){//true     判断某对象是不是mock对象System.out.println("Mockito.mockingDetails(mockUserService).isMock() = " + Mockito.mockingDetails(mockUserService).isMock());//false     判断某对象是不是apy对象System.out.println("Mockito.mockingDetails(mockUserService).isMock() = " + Mockito.mockingDetails(mockUserService).isMock());//true     判断某对象是不是spy对象System.out.println("Mockito.mockingDetails(spyUserService).isSpy() = " + Mockito.mockingDetails(spyUserService).isSpy());//true     判断某对象是不是spy对象,因为spy是一种特殊的mock(spy对象是另一种不同类型的mock对象)System.out.println("Mockito.mockingDetails(spyUserService).isMock() = " + Mockito.mockingDetail(spyUserService).isMock());}
}

spy对象是一种特殊的mock对象

方法二:Mockito.mock(X.class)等静态方法

public class InitMockSpyMethod1{private UserService mockUserService;private UserService spyUserService;@BeforeEachpublic void init(){mockUserService = Mockito.mock(UserService.class);spyUserService =  Mockito.spy(UserService.class);}@Testpublic void test1(){System.out.println("Mockito.mockingDetails(mockUserService).isMock() = " + Mockito.mockingDetails(mockUserService).isMock());System.out.println("Mockito.mockingDetails(mockUserService).isSpy() = " + Mockito.mockingDetails(mockUserService).isSpy());System.out.println("Mockito.mockingDetails(spyUserService).isMock() = " + Mockito.mockingDetails(spyUserService).isMock());}
}

方法三:MockitoAnnotations.openMocks(this)+@Mock等注解

public class InitMockSpyMethod1{@mockprivate UserService mockUserService;@Spyprivate UserService spyUserService;@BeforeEachpublic void init(){MockitoAnnotations.openMocks(this);}@Testpublic void test1(){//true     判断某对象是不是mock对象System.out.println("Mockito.mockingDetails(mockUserService).isMock() = " + Mockito.mockingDetails(mockUserService).isMock());//false     判断某对象是不是apy对象System.out.println("Mockito.mockingDetails(mockUserService).isMock() = " + Mockito.mockingDetails(mockUserService).isMock());//true     判断某对象是不是spy对象System.out.println("Mockito.mockingDetails(spyUserService).isSpy() = " + Mockito.mockingDetails(spyUserService).isSpy());//true     判断某对象是不是spy对象,因为spy是一种特殊的mock(spy对象是另一种不同类型的mock对象)System.out.println("Mockito.mockingDetails(spyUserService).isMock() = " + Mockito.mockingDetail(spyUserService).isMock());}
}

五:参数匹配

参数匹配指的是:通过方法签名(参数)来指定哪些方法调用需要处理被处理(插桩、verify验证)

对于mock对象不会调用真实方法,直接返回mock对象的默认值;

默认值(int)、null(UserVO)、空集合(list)

六:方法插桩

指定调用某个方法时的行为(stubbing),达到相互隔离的目的

/**
*测试插桩时的参数匹配
*/
@Test
public void test2(){UserUpdateReq userUpdateReq1 = new UserUpdateReq();userUpdateReq1.setId(1L);userUpdateReq1.setPhone("1L");//指定参数为userUpdateReq1时调用mockUserService.modifyById(userUpdateReq1);Mockito.doReturn(99).when(mockUserService).modifyById(userUpdateReq1);int result1 = mockUserService.modifyById(userUpdateReq1);//运行结果为99System.out.println("result1 = " + result1);UserUpdateReq userUpdateReq2 = new UserUpdateReq();userUpdateReq2.setId(2L);userUpdateReq2.setPhone("2L");int result2 = mockUserService.modifyById(userUpdateReq2);//运行结果为0System.out.println("result2 = " + result2);
}

总结

是告诉mockito当传入的是下面的参数这个类型时,才对其进插桩,若不是这个值,则不用对它进行插桩

若想要拦截某种类型的任意对象,则需要运用到:

ArgumentMatchers.any拦截UserUpdateReq类型的任意对象

 校验

 add方法调用一次,校验通过。

  private UserService mockUserService;@Testpublic void test4(){List<String> features = new ArrayList<>();mockUserService.add("实验","123",festures);//校验参数为"乐之者","123",festures,features的add方法调用了1次Mockito.verify(mockUserService,Mockito.times(2)).add("实验","123",festures);//报错  ,要么都用要么就都别用// Mockito.verify(mockUserService,Mockito.times(2)).add("实验","123",festures);//此时可以校验通过Mockito.verify(mockUserService,Mockito.times(2)).add(anyString(),anyString(),anyList());}}

但是有一点需要牢记的,除了any,还有(anyLong,anyString...),注意他们都不包括null,如果传null,还是不能被匹配的。

通过插桩,指定方法的返回值:

void返回值方法插桩 :

 

插桩的两种方式:

多次插桩:

其中when(mockList.size()).thenReturn(1).thenReturn(2).thenReturn(3)可以简写为when(mockList.size()).thenReturn(1,2,3);

thenAnswer指定插桩逻辑:

执行真正的原始方法:

verify的使用:

@InjectMocks注解的使用

1.被@InjectMocks标注的属性必须是实现类,因为mockito会创建对应的实例对象,默认创建的对象就是未经过mockito处理的普通对象。因此常配合@spy注解使其变成默认调用真实方法的mock对象。

2.mockito会使用spy,最终的结果就是,会把userFeatureService给注入到InjectMocks标注的变量所对应的对象里面去。

注入的原理

http://www.yayakq.cn/news/735608/

相关文章:

  • 浙江省建设职业技术学院网站做恒生指数看什么网站
  • 厂字型布局网站例子域名网站这么做
  • 信誉好的徐州网站建设wordpress怎么禁止回复
  • 正安县住房和城乡建设局网站重庆商务网站建设
  • 电影新网站如何做seo优化网络推广工作内容怎么写
  • 网页设计中返回首页怎么设计哈尔滨优化seo外包公司
  • 网站建设qq东莞网络推广产品的公司吗
  • 网站配色案例分析php中switch做网站
  • 响应式网站做mipwordpress支付代码
  • 花乡做网站公司建e室内设计网专业的室内设计
  • 网站建设中的多语言翻译如何实现免费一级域名注册教程
  • 扬州网站建设推广专家小程序怎么开
  • 免费商城自助建站赣州市城乡建设局网站
  • 网站建设对电子商务的意义如何在公司服务器建个内部 网站
  • 网站名称需要备案吗建设一元云购类网站
  • 旅游网站建设问题东莞seo外包超联seo
  • 如何建立公司网站淘宝指数入口
  • 南宁制作网站服务商成都建立公司网站
  • 广州做网站公司哪家好南皮县建设局网站
  • 南江县建设局网站策划公司属于什么行业
  • wordpress语言包下载检查网站的跳转路径是否清晰 哪里要优化
  • 广州专业建设网站浙江省建设信息港网
  • 做新网站不换域名wordpress如何更换域名
  • 凡客网站登录建设能源官方网站
  • 庭院设计网站推荐随州网站建设
  • 网站搜索排名高怎么做wordpress 导航图片
  • 网站建设汇报 安全保障内衣网站建设详细方案
  • 定制旅游网站建设成都app推广方案
  • 如何优化网站关键词东莞人才服务中心官网
  • 网站开发有侵权吗个人网上公司注册流程图