`
heipark
  • 浏览: 2077775 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mockito中两种部分mock的实现

阅读更多

什么是类的部分mock(partial mock)?

A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。

 

 

为什么需要部分mock?

A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。

 

 

mockito实现部分mock的两种方式:spy和callRealMethod()

spy实现

 

List<String> list = new LinkedList<String>();
List<String> spy = spy(list);
when(spy.size()).thenReturn(100);

spy.add("one");
spy.add("two");

assertEquals(spy.get(0), "one");
assertEquals(100, spy.size());

 

 

spy的原理是,如果不打桩默认都会执行真实的方法,如果打桩则返回桩实现。

可以看出spy.size()通过桩实现返回了值100,而spy.get(0)则返回了实际值。

严重注意:使用spy的桩实现实际还是会调用stub的方法,只是返回了stub的值,验证代码如下:

 

 

	@Test
	public void spyTest() {
		Jack spyJack = spy(new Jack());
		when(spyJack.go()).thenReturn(false);

		assertFalse(spyJack.go());
	}

	class Jack {
		public boolean go() {
			System.out.println("I say go go go!!");
			return true;
		}
	}

 

go方法的返回值的确返回的桩实现,但是通过console看到go()方法的确输出了文字。

★ 批注:又捣鼓了一下,发下使用语句“doReturn(1111).when(spyJack).go();” 是好使的,这是一个陷阱,使用的时候要注意。

 

callRealMethod()实现

 

	@Test
	public void callRealMethodTest() {
		Jerry jerry = mock(Jerry.class);

		doCallRealMethod().when(jerry).goHome();
		doCallRealMethod().when(jerry).doSomeThingB();

		jerry.goHome();

		verify(jerry).doSomeThingA();
		verify(jerry).doSomeThingB();
	}

	class Jerry {
		public void goHome() {
			doSomeThingA();
			doSomeThingB();
		}

		// real invoke it.
		public void doSomeThingB() {
			System.out.println("good day");

		}

		// auto mock method by mockito
		public void doSomeThingA() {
			System.out.println("you should not see this message.");

		}
	}
 

    通过代码可以看出Jerry是一个mock对象, goHome()和doSomeThingB()是使用了实际调用技术,而doSomeThingA()被mockito执行了默认的answer行为(这里是个void方法,so,什么也不干)。

 

总结:

    spy和callrealmethod都可以实现部分mock,唯一不同的是通过spy做的桩实现仍然会调用实际方法(我都怀疑这是不是作者的bug)。

   ★ 批注:spy方法需要使用doReturn方法才不会调用实际方法。

 

    mock技术是实施TDD过程必备的装备,熟练掌握mockito(或者其他工具)可以更有效的进行测试。虽然mockito作者也觉得部分测试不是好的设计,但是在java这样一个不是完全面向对象技术的平台上,我们其实没必要过分纠结这些细节,简洁,可靠的代码才是我们需要的。

 

 

参考资料:

http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#1

 

--heipark

 

 

分享到:
评论

相关推荐

    Introduction-to-Mock-with-Mockito-:Mockito的Mock简介

    本项目的目的是介绍IntelliJ IDEA中Mockito框架和测试模板的较不常见的功能。 我将从模拟/存根的基本内容开始,以便为更高级的内容奠定基础。 他们将帮助我们强调与Mockito合作时我们日常遇到的问题,并提供解决...

    mockito-core-4.0.0-API文档-中文版.zip

    赠送jar包:mockito-core-4.0.0.jar; 赠送原API文档:mockito-core-4.0.0-javadoc.jar; 赠送源代码:mockito-core-4.0.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-4.0.0.pom; 包含翻译后的API文档:...

    springboot + mockito 使用示例代码-原创

    单元测试工具mockito代码使用示例 文章地址 https://blog.csdn.net/qq_37813031/article/details/104557376

    mockito-core-2.15.0-API文档-中文版.zip

    赠送jar包:mockito-core-2.15.0.jar; 赠送原API文档:mockito-core-2.15.0-javadoc.jar; 赠送源代码:mockito-core-2.15.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-2.15.0.pom; 包含翻译后的API文档...

    Mocks, Mockito, and Spock

    Mocks or mock objects simulate the behavior of complex, real (non­mock) objects and are therefore useful when a real object is impractical or impossible to incorporate into a unit test. They provide:...

    mockito中文文档.zip

    内容为.md文件

    Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例

    今天小编就为大家分享一篇关于Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    mockito-core-3.8.0-API文档-中文版.zip

    赠送jar包:mockito-core-3.8.0.jar; 赠送原API文档:mockito-core-3.8.0-javadoc.jar; 赠送源代码:mockito-core-3.8.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.8.0.pom; 包含翻译后的API文档:...

    MockNewsNStatics:使用Mockito静态和构造函数调用进行测试的其他方法

    模拟新闻NStatics 如何将Mockito与构造函数和静态函数一起使用的示例

    Mockito-Programming-Cookbook

    Mockito is an open source testing framework for Java released under the MIT License. The framework allows the creation of test double objects (mock objects) in automated unit tests for the purpose of ...

    mockito-core-4.0.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-4.0.0.jar; 赠送原API文档:mockito-core-4.0.0-javadoc.jar; 赠送源代码:mockito-core-4.0.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-4.0.0.pom; 包含翻译后的API文档:...

    mockito-core-3.1.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-3.1.0.jar; 赠送原API文档:mockito-core-3.1.0-javadoc.jar; 赠送源代码:mockito-core-3.1.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.1.0.pom; 包含翻译后的API文档:...

    HttpServletRequst的mock实现基础上的测试案例介绍

    1.无maven,照样实现发布war中不含测试代码 在主工程中,不包含任何测试代码,理论上连main方法都不应该存在。测试代码常常放在与主工程同package的下面,以Test+className作为类名。由于采用了junit4,建议使用...

    Mockito for spring

    Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito ...

    mockito-jar.zip

    mockito-all-1.10.19.jar mockito-core-4.5.1.jar mockito-junit-jupiter-4.5.1.jar mockito-junit-jupiter-4.5.1-sources.jar

    Mockito+Junit5测试方法实践

    内容概要:参考Mockito官方API文档,实践框架每个特性。 适合人群:Mockito入门人员以及想全面熟悉Mockito特性的人员,做到了开箱即用。 能学到什么:“Mockito 4.6.0 + Junit 5”的组合编程。 使用建议:使用前安装...

    mockito-1.9.5.zip

    mockito junit 单元测试 mockito junit 单元测试

    mockito-1.9.0.zip

    mockito-1.9.0.zip,免费下载,需要的拿去

    mockito-core-3.9.0-API文档-中文版.zip

    赠送jar包:mockito-core-3.9.0.jar; 赠送原API文档:mockito-core-3.9.0-javadoc.jar; 赠送源代码:mockito-core-3.9.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.9.0.pom; 包含翻译后的API文档:...

    Mockito Essentials(PACKT,2014)

    Whether you are new to JUnit testing and mocking or a seasoned Mockito expert, this book will provide you with the skills you need to successfully build and maintain meaningful JUnit test cases and ...

Global site tag (gtag.js) - Google Analytics