`
heipark
  • 浏览: 2097530 次
  • 性别: 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

 

 

分享到:
评论

相关推荐

    Mocks, Mockito, and Spock

    在Mockito中创建Mocks非常简单,可以通过以下两种方式实现: 1. **使用注解**:通过`@Mock`注解来声明一个模拟对象。例如:`@Mock BookDao mockedBookDao;` 2. **手动创建**:使用`mock()`方法来创建模拟对象。例如...

    EasyMock与Mockito 使用

    EasyMock和Mockito是两个广泛使用的Java模拟框架,它们可以帮助开发者在隔离环境中测试代码,避免了依赖其他组件或服务的复杂性。本文将详细介绍这两个工具的使用方法、原理和差异。 **EasyMock** EasyMock是一个...

    mock开发所用到的2个核心JAR

    在给定的压缩包文件中,包含的两个核心JAR文件——`mockito-all-2.0.2-beta.jar` 和 `mockito-core-2.7.19.jar`,都是Mockito框架的重要组成部分。 1. **mockito-all-2.0.2-beta.jar**: 这是一个早期版本的...

    mockito-1.9.5.zip

    Mockito 允许开发者创建模拟对象(mock objects)来代替真实的依赖,这样在测试中就可以控制这些依赖的行为。它提供了以下关键特性: - **模拟方法调用**:你可以定义模拟对象的方法在被调用时如何响应,包括返回...

    PowerMock+Mockito-junit测试套件1.6.3版本

    例如,使用PowerMock模拟难以测试的部分,用Mockito定义mock对象的行为,最后由JUnit执行并报告测试结果。通过这种方式,开发者可以确保代码的质量和可靠性,提高软件的稳定性。同时,这个版本的测试套件也意味着它...

    mock 介绍及原理,前后端 mock方法

    Mock 的实现原理主要基于两种方式:一是通过修改请求的原服务地址为 Mock 服务地址,二是拦截原服务的请求或者响应,Mock 返回值。常见的服务或接口协议主要有 RPC 和 HTTP/HTTPS 两种,Mock 原理类似,要么是修改原...

    Mastering Unit Testing Using Mockito and JUnit

    Mockito 是一个流行的Java单元测试框架,它提供了一种简单直观的方式来创建mock对象。Mock对象是用来模拟其他对象的行为,以便在单元测试中隔离被测对象。Mockito支持多种类型的mock行为,如验证方法调用、设置...

    mock

    在IT行业中,Mock技术是一种非常重要的测试方法,它允许开发者模拟复杂的系统组件,以便在测试过程中专注于单个组件的行为,而无需依赖整个系统的其他部分。本文将深入探讨Mock的概念及其在Struts2与Spring框架中的...

    mockito单元测试

    本文将详细介绍Mockito这一流行的Mock工具在单元测试中的应用。 #### 二、Mockito 概述 ##### 2.1 Mockito 简介 Mockito是一个广泛使用的Java Mock框架,它允许开发者轻松地创建Mock对象,以便在单元测试中模拟...

    单元测试MockBean和SpyBean的简单用法

    在这个过程中,MockBean和SpyBean是两种常用的工具,它们可以帮助我们创建模拟对象(Mocks)和部分模拟对象(Spies),以便在测试中控制依赖关系。下面将详细介绍MockBean和SpyBean的使用方法及其在单元测试中的作用...

    Mockito-and-Junit:Java Mock deafferents方法的示例存储库

    Mockito 和 JUnit 是 Java 开发中常用的两个测试框架,它们在软件开发过程中扮演着重要的角色。Mockito 是一个用于创建模拟对象(mock objects)的工具,它允许开发者在单元测试中隔离被测试代码,避免外部依赖的...

    Android-okhttp-json-mock帮助你为Okhttp和Retrofit模拟json格式的数据

    在实际应用中,"Android-okhttp-json-mock"还可以与Mockito、Robolectric等测试框架结合,提供更加完整的测试环境。你可以为每个测试用例设定不同的mock数据,确保测试的覆盖性和准确性。 通过这种方式,开发者可以...

    基于Java探针的Mock框架.zip

    "基于Java探针的Mock框架"可能是指一种结合了这两种技术的工具,它可能是为了提供更高级别的测试控制和深入的程序分析。 首先,我们来理解Java探针(Java Profiler)。Java探针通常包含以下功能: 1. **性能分析**...

    mock&mysql;问题

    Mocking是一种软件开发技术,主要用于在单元测试中模拟依赖项,以便我们可以独立地测试代码的特定部分,而不会受到真实系统组件的影响。MySQL则是一种广泛使用的开源关系型数据库管理系统,它在Web应用程序和其他...

    My-Mockito-Framework:Mockito在内部如何工作?

    Mockito是一款广泛使用的Java单元测试框架,它允许开发者模拟(mock)对象的行为,以便在测试过程中专注于被测试代码的功能,而无需依赖实际的外部依赖。本文将深入探讨Mockito的内部工作原理,以及如何利用Mockito...

    mock:httpclient用例

    在IT行业中,Mock和HTTPClient是两个非常关键的概念,特别是在进行单元测试和网络通信时。本文将详细探讨这两个概念,并结合Java语言,介绍如何在实际项目中使用它们。 首先,让我们了解一下什么是Mock。Mocking是...

    百灵报表 dome mock 实例 hibernate spring struts2 struts

    标题中的“百灵报表 dome mock 实例 hibernate spring struts2 struts”表明这是一个关于集成百灵报表系统(BIRT)与Java后端技术的项目,包括Hibernate ORM框架、Spring框架以及Struts2和Struts的使用。描述进一步...

    JUnitAndMockitoExample:关于JUnit和Mockito的文章的最终代码

    4. 测试逻辑:在测试方法中,使用Mockito的API设置mock对象的行为,然后执行被测代码,最后通过JUnit的断言验证结果。 通过这样的例子,开发者可以学习如何有效地组织测试代码,如何使用Mockito来模拟复杂的依赖...

    junit-mock:分支在 unti 测试中呈现不同类型的模拟

    5. **Partial Mock**:这种模拟类型允许你只模拟一个类的部分行为,而其他行为则使用实际的实现。这在你只想模拟一两个方法,但不想为整个类创建mock时非常有用。 6. **Argument Captor**:Mockito的这个特性允许你...

    模拟演示:28分钟内的Mockito演示

    2. **创建模拟对象**:在Mockito中,你可以使用`mock()`函数创建一个模拟对象。例如,`Mockito.mock(MyClass.class)`会创建一个MyClass的模拟实例。 3. **配置模拟对象**:你可以设定模拟对象在特定方法被调用时的...

Global site tag (gtag.js) - Google Analytics