Mockito单元测试详解

这篇具有很好参考价值的文章主要介绍了Mockito单元测试详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、常用注解

依赖:

SpringBoot默认的Mock框架是Mockito,和junit一样,只需要依赖spring-boot-starter-test就可以了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

(1)@RunWith 指定运行环境,例:

@RunWith(SpringRunner.class) Junit运行Spring的测试环境

@RunWith(MockitoJUnitRunner.class) Junit运行Mockito的运行环境,不会加载springboot上下文

@SpringBootTest 加载springboot上下文配置

(注意: @RunWith(MockitoJUnitRunner.class) 不能和 @RunWith(SpringRunner.class) 同时使用,而一般都需要 @RunWith(SpringRunner.class) 提供spring容器环境,所以很少用这个注解)

(2)@Mock 用于模拟一个服务,例如:

测试的时候需用调用B服务,但是B服务没写 好,这是可以先Mock一个B服务

(3)@InjectMocks 标注服务的实现类

创建一个实例,其余用@Mock注解创建的mock将被注入到用该实例中

(4)@Before 每个测试方法执行前,执行一次

(5)@After 每个测试方法执行完,执行一次

(6)@Test 标注测试方法

(7)@MockBean : mock对应引入的bean

二、注入其它mock对象

如果一个mock对象中需要注入其它mock对象,比如要mock UserService,UserService 依赖于另一个mock对象orderService,这时就不能直接对 UserSiervice 使用 @Mock 直接的注解,需要:

  • 测试类上加 @TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
  • 标注 @InjectMocks + @Autowired之类的注入注解
@SpringBootTest
@RunWith(SpringRunner.class)
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class)  //step1
public class RuleRpcServiceTest extends KdAbstractJUnit4SpringContextTests {

    @Mock
    private OrderService orderService;

	//step2
    @InjectMocks
    @Resource
    private UserServiceImpl userService;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }
    
}

三、when…then和do…when用法

when…then:

Long userId = 10L;

//thenReturn 返回指定数据
when(userService.findById(userId)).thenReturn(new User(userId, null));

//触发上面mock定义的thenReturn
User user1 = userService.findById(userId);
System.out.println(user1);


//thenCallRealMethod 调用mock类原本的方法
when(userService.findById(userId)).thenCallRealMethod();

do…when:

doReturn(new User(userId, null)).when(userService).findById(userId);

doCallRealMethod().when(userService).findById(userId);

doThrow(new RuntimeException("xxx不合法")).when(userService).findById(userId);

四、controller单元测试

(1)、MockMvcRequestBuilders

构建各类HTTP Request请求的工厂方法

  • get(urltemplate, vars)
  • post(urltemplate, vars)
  • delete(urltemplate, vars)
  • put(urltemplate, vars)

(2)MockHttpServletRequestBuilder

构建Request的缺省builder

  • cookie(Cookie… cookie): 设置信息
  • content(String str): 请求内容
  • contentType(): 设置contentType类型
  • param(String name, String … value): 设置参数
  • session()
  • requestAttr()
  • flashAttr()
  • locale()
  • accept(): 接手内容类型MediaType

(3)ResultMatcher


功能描述: 用来执行

  • match(MvcResult result): void     针对执行结果进行断言判断
  • matchAll(ResultMatcher… matchers) : ResultMatcher    执行断言,批量执行

(4)ResultHandler


结果信息Handler

  • void handle(MvcResult result) : 处理结果信息

(5)ResultActions

  • andExpect(ResultMatcher var1) : ResultActions   对返回的Result结果进行断言, 返回为ResultActions,运行流式风格调用
  • andDo(ResultHandler handler): ResultActions   添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。返回对象为ResultActions
  • andReturn() : MvcResult   表示执行完成后返回相应的结果,其结果为MvcResult

(6)MvcResult


访问Http请求的结果信息

  • getRequest()
  • getResponse()
  • getHandler()
  • getModelAndView()

…(7)MockMvcResultMatchers


提取请求结果信息的各类断言

  • status(): StatusResultMatchers 得到响应状态验证器
  • content(): 内容
  • header(): 头信息,比如验证处理器类型/方法名
  • model(): 模型信息
  • flash(): Flash attribute
  • forwardedUrl():  验证处理完请求后转发的url(绝对匹配)
  • redirectedUrl()
  • cookie()
  • jsonPath(String expression, Matcher matcher) 得到Json表达式验证器
  • jsonPath(String expression, Object… args)
  • xpath(String expression, Object… args)
  • xpath(String expression, Matcher matcher)

其中Matcher类为org.hamcrest包中的类。

(8)StatusResultMatchers
检查结果中的各类信息

  • isBadRequest(): 不合法的请求
  • isOk(): 200

参考:springBoot项目使用Mock单元测试Controller层 - 知乎

接口demo:

 @GetMapping("/xx/listXxx/{param}")
public ResultSet<List<XXXXVO>> listXxx(@PathVariable("param") String param){
	//查询逻辑
	List<XXXXVO> xxList = new ArrayList<>();
	return ResultSet.success(xxList);
}

单元测试:文章来源地址https://www.toymoban.com/news/detail-405651.html

    @Test
    public void testListXxx() throws Exception {
        //请求的url地址
        String url = "/xx/listXxx/{param}";
		//构造Request,param=123456
        mvc.perform(MockMvcRequestBuilders.get(url, "123456")
                .accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().json("{'code':'200'}"))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
    }

到了这里,关于Mockito单元测试详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单元测试与Mockito

    系列文章目录和关于我 最近在新公司第一次上手写代码,写了一个不是很难的业务逻辑代码,但是在我写单元测试的时候,发现自己对单元测试的理解的就是一坨,整个过程写得慢,还写得臭。造成这种局面我认为是因为: 对Mockito api是不是很熟悉 没有自己单元测试方法论

    2023年04月22日
    浏览(37)
  • 单元测试Mockito

    Mockito 1.为什么要mock? mock等于是创建一个虚拟对象(不会去跑真实的),在测试环境中替换掉真是对象,从而 验证该对象某些方法的调用情况,调用多少次,参数等 给对象做一个定义,指定返回结果或者特定的动作 2.什么是mock,stub和spy mock: Mock 对象是一种完全由测试控制

    2024年03月18日
    浏览(39)
  • Spring单元测试+Mockito

    一,背景 单元测试基本上是开发逃不过的一个工作内容,虽然往往因为过于无聊,或者过于麻烦,而停止于项目的迭代之中,不了了之了。其实不是开发们懒,而是上头要求的测试覆盖率高,但是又没有好用的工具,导致工作积压,最后只能舍弃掉这部分。 最近发现Spring+

    2024年04月17日
    浏览(41)
  • 单元测试-mockito

    在单元测试中,对于一个类中的方法,常常需要依赖其他类的方法、操作数据dto等对象实例。 方法mock:依赖的方法又可能依赖其他方法,呈现级联的树状结构。 问题:在一些情况下,这个依赖树会很深,其中依赖的一个子方法一旦修改出现问题,如果引起大量的单测不可用

    2024年04月11日
    浏览(68)
  • Mockito单元测试基本使用

    本文参考: 【码农教程】手把手教你Mockito的使用 - 掘金 (juejin.cn) java - doReturn().when()与when().thenReturn() - 成长之路 - SegmentFault 思否 单元测试实践篇:Mock_阿里巴巴淘系技术团队官网博客的博客-CSDN博客 阿里是如何进行单元测试培训的?_Hollis Chuang的博客-CSDN博客 【Mockito】Mock

    2024年02月10日
    浏览(48)
  • Mockito单元测试异常情况

    一、空指针异常 例子: 使用Collectors.groupingBy()进行分组时, 分组值存在null值 。 解决办法:分组值为null时,默认值为空字符,或者让数据不为空。 二、多个参数匹配异常 例如: 如果a和b一个是正常传参(list、map、string…)另一个是任意万能传参(any()、anyList()、anyString(

    2024年02月07日
    浏览(48)
  • Java单元测试之Mockito

    Mockito是一种Java Mock框架,主要就是用来做Mock测试的,它可以模拟任何Spring管理的Bean、模拟方法的返回值、模拟抛出异常等等,同时也会记录调用这些模拟方法的参数、调用顺序,从而可以校验出这个Mock对象是否有被正确的顺序调用,以及按照期望的参数被调用。 Mockito的特

    2024年02月13日
    浏览(49)
  • 【SpringBoot】mockito+junit 单元测试

    CommonServiceImpl 在方法 getSourceCodeMap() 调用了 ServiceA 的方法 list(QueryBO queryBo) 。 org.mockito.exceptions.base.MockitoException: No tests found in ClientSyncServiceImplTest Is the method annotated with @Test? Is the method public? 解决方案: Test引入 org.junit.Test 不要引入 org.junit.jupiter.api.Test 例如获取当前用户 moc

    2024年02月09日
    浏览(42)
  • 单元测试之- mock工具mockito

     常用的mock工具mockito 在编写单元测试时,需要mock依赖的对象,减少依赖对象对测试的影响,Mocktio是常用的mock工具之一,那么mockito提供了哪些功能呢? Mock对象的创建和配置:Mockito可以通过简单的语法创建mock对象,并允许你配置mock对象的行为。 Mock对象的验证:Mockito提供

    2024年02月13日
    浏览(39)
  • 单元测试(mock) 错误org.mockito.Mockito.framework()Lorg/mockito/MockitoFramework;解析

      如果您觉得有用的话,记得给 博主点个赞,评论,收藏一键三连啊 ,写作不易啊^ _ ^。   而且听说 点赞的人每天的运气都不会太差 ,实在白嫖的话,那欢迎常来啊!!! 01 准备 01::01 安装maven dependency helper插件和maven helper插件 用来分析你的依赖 打开idea 选择 File - Settin

    2023年04月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包