Mockito 之 verify 使用方法

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

这里以 AlphaService、BetaService 为例,将 BetaService 作为单元测试的目标类。

public class EatInfo {
	private String food;
	private String address;
	
	// setter/getter ...
}

@Service
public class AlphaService {
	public void init() {
		System.out.println("init...");
	}
	
	public void say(String content) {
		System.out.println(content);
	}
	
	public void run() {
		System.out.println("run...");
	}

	public void eat(EatInfo eatInfo) {
		System.out.println("go to" + eatInfo.getAddress() + " to eat " + eatInfo.getFood());
	}
}

@Service
public class BetaService {
	@Autowired
	private AlphaService alphaService;
	public void sayHello() {
		alphaService.init();

		alphaService.say("hello");

		EatInfo eatInfo = new EatInfo();
		eatInfo.setFood("饺子");
		eatInfo.setAddress("你家");
		alphaService.eat(eatInfo);
	}
}

@RunWith(MockitoJUnitRunner.class)
public class BetaServiceTest {
	@InjectMocks
    private BetaService betaService;
    
    @Mock
	private AlphaService alphaService;

	@Test
	public void sayHello1() {
		...
		
		betaService.sayHello();
		
		...
	}
}

各场景下 verify 的使用:

  1. 校验 BetaService.sayHello 中是否调用了 AlphaService.init

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 是否调用了 AlphaService.init
    		verify(alphaService).init();
    	}
    }
    
  2. 校验 BetaService.sayHello 中调用了 AlphaService.init 的次数

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 是否调用了 AlphaService.init 1 次
    		verify(alphaService, times(1)).init();
    	}
    }
    

    其实,这里 verify(alphaService, times(1)).init() 等同于 verify(alphaService).init()。让我们来看下 verify(…) 的源代码实现就知道了,如下图:
    Mockito 之 verify 使用方法

  3. 校验 BetaService.sayHello 中没有调用过 AlphaService.run

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 没有调用过 AlphaService.run 
    		verify(alphaService, times(0)).run();
    	}
    }
    

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 没有调用过 AlphaService.run 
    		verify(alphaService, never()).run();
    	}
    }
    
  4. 校验 BetaService.sayHello 中的 AlphaService.run 方法 最少 or 最多 调用了多少次

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 中 AlphaService.run 方法最少被调用过 1 次
    		verify(alphaService, atLeast(1)).run();
    		// 校验 betaService.sayHello() 中 AlphaService.run 方法最多被调用过 5 次
    		verify(alphaService, atMost(5)).run();
    	}
    }
    
  5. 校验 BetaService.sayHello 中的 AlphaService.say 方法被调用的时候,是否使用了特定的参数

    固定参数值:

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 调用 AlphaService.say 的时候,参数值是 "hello" 
    		verify(alphaService).say("hello");
    	}
    }
    

    任何参数值:

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 调用 AlphaService.say 的时候,参数值是任何字符串
    		verify(alphaService).say(anyString());
    	}
    }
    
  6. 校验 BetaService.sayHello 中的 AlphaService.eat 方法被调用的时候,作为参数的 EatInfo 对象中属性 food 值为 “饺子”, 属性 address 值为 “你家”

    @RunWith(MockitoJUnitRunner.class)
    public class BetaServiceTest {
    	@InjectMocks
        private BetaService betaService;
        
        @Mock
    	private AlphaService alphaService;
    
    	@Test
    	public void sayHello1() {
    		...
    		
    		betaService.sayHello();
    		
    		...
    
    		// 校验 betaService.sayHello() 调用 AlphaService.eat 的时候,作为参数的 EatInfo 对象中属性 food 值为 "饺子", 属性 address 值为 "你家"
            ArgumentCaptor<AlphaService> alphaServiceAC = ArgumentCaptor.forClass(AlphaService.class);
            verify(alphaService).eat(alphaServiceAC.capture());
    		assertThat(alphaServiceAC.getValue().getFood(), allOf(notNullValue(), is("饺子")));
            assertThat(alphaServiceAC.getValue().getAddress(), allOf(notNullValue(), is("你家")));
    	}
    }
    

    **这里用到了「参数捕获器」 ArgumentCaptor **

  7. 校验在 BetaService.sayHello 中方法的调用顺序是 alphaService.init、alphaService.say、alphaService.eat文章来源地址https://www.toymoban.com/news/detail-433778.html

    	@RunWith(MockitoJUnitRunner.class)
    	public class BetaServiceTest {
    		@InjectMocks
    	    private BetaService betaService;
    	    
    	    @Mock
    		private AlphaService alphaService;
    	
    		@Test
    		public void sayHello1() {
    			...
    			
    			betaService.sayHello();
    			
    			...
    
    			// 校验 betaService.sayHello() 中方法的调用顺序是 alphaService.init、alphaService.say、alphaService.eat
    		    InOrder alphaServiceIO = inOrder(alphaService);
    		    alphaServiceIO.verify(alphaService).init();
    		    alphaServiceIO.verify(alphaService).say(anyString());
    		    alphaServiceIO.verify(alphaService).eat(any(EatInfo.class));
    		}
    	}
    	```
    
    

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

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

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

相关文章

  • 【JAVA】方法的使用:方法语法、方法调用、方法重载、递归练习

    🍉内容专栏:【JAVA从0到入门】 🍉本文脉络:JAVA方法的使用,递归练习 🍉本文作者:Melon_西西 🍉发布时间 :2023.7.19 目录 1. 什么是方法(method) 2 方法定义 2.1 方法定义语法格式  例子:两个数相加 例子:判断某一年是否为闰年并调用判断函数  2.2 方法定义注意事项 3 方法

    2024年02月14日
    浏览(43)
  • ipad的正确使用方法视频,ipad的正确使用方法图解

    iPad是由苹果公司于2010年开始发布的平板电脑系列,定位介于苹果的智能手机iPhone和笔记本电脑产品之间,(屏幕中有4个虚拟程序固定栏)与iPhone布局一样,提供浏览网站、收发电子邮件、观看电子书、播放音频或视频、玩游戏等功能。 下面是我收集整理的苹果平板电脑ipad怎么

    2023年04月11日
    浏览(45)
  • Mockito中模拟静态方法

    在项目实际开发中,编写单元测试用例时,需要对静态方法进行模拟,本次文章就简单整理下如何使用Mockito来模拟静态方法。 测试类中有两个方法,一个带参数,一个不带参数 在Mockito中可以使用Mockito.mockStatic( Class classToMock )方法来模拟对静态方法的调用,它会返回一个Mo

    2024年02月13日
    浏览(30)
  • valgrind基本功能介绍、基础使用方法说明 valgrind基本功能介绍、基础使用方法说明

    valgrind基本功能介绍、基础使用方法说明_valgrind使用方法_HNU Latecomer的博客-CSDN博客 拷贝效果不好,请看原文。 1、Valgrind概述 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。 Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(f

    2024年02月07日
    浏览(59)
  • 【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏 :Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 方

    2024年02月08日
    浏览(39)
  • 深入了解 Java 方法和参数的使用方法

    方法是一块仅在调用时运行的代码。您可以将数据(称为参数)传递到方法中。方法用于执行特定的操作,它们也被称为函数。 重用代码:定义一次代码,多次使用。 提高代码的结构化和可读性。 将代码分解成更小的模块,易于维护和理解。 方法必须在类内声明。它的定义

    2024年02月19日
    浏览(44)
  • JavaScript中apply函数方法多种使用方法!

    在JavaScript中, apply 是函数对象的一个方法,用于调用一个函数,并指定函数内部的 this 上下文以及函数的参数列表。它与另一个方法 call 功能类似,但是参数传递的方式略有不同。 apply 方法的语法如下: thisArg : 在调用函数时指定的 this 上下文,即函数内部的 this 指向的对

    2024年03月10日
    浏览(60)
  • C# 使用 RabbitMQ 的详细使用方法

    C# 使用 RabbitMQ 的详细使用方法) RabbitMQ 是一个功能强大的消息队列系统,可用于在分布式系统中进行可靠的消息传递。本篇博客将详细介绍如何在 C# 中使用 RabbitMQ 实现各种消息队列操作,包括连接 RabbitMQ 服务器、创建通道、声明队列、发布消息以及消费消息等。 RabbitMQ 是一

    2024年04月25日
    浏览(36)
  • 27 使用Arrays.asList生成的集合无法使用add、addAll方法及解决方法。

            使用 Array.asList方法生成的ArrayList继承的是AbstractList抽象类 ,如下图所示。          AbstractList又继承了AbstractCollection抽象类,实现了List接口的方法,如下图所示。         如下图所示。可以发现, AbstractionCollection实现了List接口的add和addAll方法。         

    2024年02月14日
    浏览(38)
  • vediojs 使用方法及使用中遇到的问题

    1、使用步骤 使用npm命令,安装 npm install video.js 首先,在main.js中引入  两种使用方法: 第一种,使用ref 下面是初始化的方法,不是很理解为什么要初始化,貌似是因为一般情况下视频会自动播放,用来解决不想让视频一上来就加载,而是在特定情况下执行时使用 ,(要在

    2024年02月13日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包