Mock单元测试

  单元测试的思路是在不涉及依赖的情况下测试代码,一般是测试service层的方法,但实际的代码常会涉及到依赖,一个可行的方法就是使用模拟对象来替换依赖对象。

1.使用Mockito生成mock对象

  Mockito 是一个流行 mock 框架,可以和JUnit结合起来使用。Mockito 允许你创建和配置 mock 对象。使用Mockito可以明显的简化对外部依赖的测试类的开发。

一般使用 Mockito 需要执行下面三步

  • 模拟并替换测试代码中外部依赖。
  • 执行测试代码
  • 验证测试代码是否被正确的执行

1.1.在maven中添加mockito依赖

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <scope>test</scope>
        </dependency>

1.2.静态引用

如果在代码中静态引用了org.mockito.Mockito.*;,那你你就可以直接调用静态方法和静态变量而不用创建对象,譬如直接调用 mock() 方法。

1.3.使用 Mockito 创建和配置 mock 对象

Mockito 还支持通过 @Mock 注解的方式来创建 mock 对象

使用注解,那么必须要实例化 mock 对象。Mockito 在遇到使用注解的字段的时候,会调用MockitoAnnotations.initMocks(this) 来初始化该 mock 对象。另外也可以通过使用@RunWith(MockitoJUnitRunner.class)来达到相同的效果。

注解

  • @Mock:创建 mock 对象
  • @InjectMocks 在 Mockito 中进行依赖注入

调用方法

when(…?.).thenReturn(…?.)可以被用来定义当条件满足时函数的返回值,如果你需要定义多个返回值,可以多次定义。当你多次调用函数的时候,Mockito 会根据你定义的先后顺序来返回返回值。Mocks 还可以根据传入参数的不同来定义不同的返回值。譬如说你的函数可以将anyString 或者 anyInt作为输入参数,然后定义其特定的放回值。

自定义方法的返回值

Mockito.when(方法).thenReturn(返回值)

Mockito.when(方法).thenReturn(返回值1).thenReturn(返回值2)

无返回值

对于无返回值的函数,我们可以使用doReturn(…?).when(…?).methodCall来获得类似的效果。例如我们想在调用某些无返回值函数的时候抛出异常,那么可以使用doThrow 方法。如下面代码片段所示

Mockito.doThrow(new IOException()).when(mockStream).close()

仅调用方法,但啥也不做

Mockito.doNothing().when(tagRepository).deleteByTagId(1)

验证 query 方法是否被 MyDatabase 的 mock 对象调用

verify(databaseMock).query("* from t");

查看在传入参数为12的时候方法是否被调用
verify(test).testing(Matchers.eq(12));

方法是否被调用两次
verify(test, times(2)).getUniqueId();

verify(mock, never()).someMethod("never called");
verify(mock, atLeastOnce()).someMethod("called at least once");
verify(mock, atLeast(2)).someMethod("called at least twice");
verify(mock, times(5)).someMethod("called five times");
verify(mock, atMost(3)).someMethod("called at most 3 times");

1.4.mockito的限制

下面三种数据类型则不能够被测试

  • final classes
  • anonymous classes
  • primitive types

Mockito 不能够 mock 静态方法,因此我们可以使用 Powermock

2.powerMock

powerMock能mock静态、final、私有方法等

PowerMock支持EasyMock和Mockito。

2.1PowerMock有两个重要的注解:
–@RunWith(PowerMockRunner.class)
–@PrepareForTest( { YourClassWithEgStaticMethod.class })
  如果你的测试用例里没有使用注解@PrepareForTest,那么可以不用加注解@RunWith(PowerMockRunner.class),反之亦然。当你需要使用PowerMock强大功能(Mock静态、final、私有方法等)的时候,就需要加注解

@PrepareForTest。

2.2基本用法

详见 http://blog.csdn.net/knighttools/article/details/44630975

2.2.1和普通Mock的用法相同

PowerMockito.when(file.exists()).thenReturn(true);

2.2.2 Mock方法内部new出来的对象

File file = PowerMockito.mock(File.class);
ClassUnderTest underTest = new ClassUnderTest();
PowerMockito.whenNew(File.class).withArguments("bbb").thenReturn(file);
PowerMockito.when(file.exists()).thenReturn(true);

2.2.3 Mock普通对象的final方法

ClassDependency depencency = PowerMockito.mock(ClassDependency.class);
ClassUnderTest underTest = new ClassUnderTest();
PowerMockito.when(depencency.isAlive()).thenReturn(true);

2.2.4.Mock普通类的静态方法

PowerMockito.mockStatic(ClassDependency.class);
PowerMockito.when(ClassDependency.isExist()).thenReturn(true);

2.2.5 Mock 私有方法

ClassUnderTest underTest = PowerMockito.mock(ClassUnderTest.class);
PowerMockito.when(underTest.callPrivateMethod()).thenCallRealMethod();
PowerMockito.when(underTest, "isExist").thenReturn(true);

2.2.6. Mock系统类的静态和final方法

ClassUnderTest underTest = new ClassUnderTest();
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getProperty("aaa")).thenReturn("bbb");

2.2.7 验证方法

(1) 验证静态方法:
PowerMockito.verifyStatic();
Static.firstStaticMethod(param);
(2) 扩展验证:
PowerMockito.verifyStatic(Mockito.times(2)); // 被调用2次

Static.thirdStaticMethod(Mockito.anyInt()); // 以任何整数值被调用

时间: 2024-10-05 22:45:20

Mock单元测试的相关文章

springboot利用mock进行junit单元测试,测试controller

1  spring-boot-starter-test内置mockito,添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> 2 示例controller packag

[python] python单元测试经验总结

python写单元大多数都会用到unittest和mock,测试代码覆盖率都会用到coverage,最后再用nose把所有的东西都串起来,这样每次出版本,都能把整个项目的单元测试都运行一遍. Unittest unittest就不详细介绍了,注意几点: 测试类继承unittest.TestCase 测试类.测试方法名字最好以test开头,很多工具能根据名字来自动运行,很方便 测试类里面的setUp/tearDown会在每个case执行之前/之后执行,setUpClass/tearDownClas

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

测试对于软件来说,是保证其质量的一个重要过程,而测试又分为很多种,单元测试.集成测试.系统测试.压力测试等等,不同的测试的测试粒度和测试目标也不同,如单元测试关注每一行代码,集成测试关注的是多个模块是否能正常的协同工作. 当我们在衡量代码好坏时,其中一点就是这些代码是否进行了单元测试,测试的质量.代码覆盖率怎么样?本文将从以下几个方面介绍.Net Core中的单元测试: 单元测试简介 .Net Core中的单元测试框架 使用xUnit.Net对.Net Core应用进行单元测试 创建xUnit.

[单元测试]Java单元测试,基于Mockito的第一次尝试

Mockito 进行Mock单元测试入门 个人理解: 单元测试:对程序中最小的运行单元就行测试,java中通常是一个类 Mock的作用是在JUnit的基础上,对于依赖进行模拟,人为的将集成测试封闭成黑盒的单元测试. 其他的具体用发和概念可以自行google,网上已经有很多解释,这里只给像我这样刚刚入门,第一次写单元测试的人做一个引导. 这里主要讲一下Mockito中 when(...).thenReturn(...) 的使用时机: 在单元测试的方法中,但有需要依赖于服务A的方法B的返回的时候,需

Entity Framework版本历史概览

EF版本 .net framework和IDE版本 主要功能 EF(or EF3.5) Visual Studio 2008 SP1 (.NET 3.5 SP1) 基本的O/R映射支持,使用DB First开发模式 EF 4 Visual Studio 2010 (.NET 4.0) 支持POCO实体 延迟加载 提高单元测试能力 自定义的代码生成机制 支持Model First开发模式 EF 4.1 NuGet 提供简化的DbContext接口 支持Code First开发模式 EF 4.1.1

【Entity Framework系列】Overview - 版本历史概览

EF版本 .net framework和IDE版本 主要功能 EF(or EF3.5) Visual Studio 2008 SP1 (.NET 3.5 SP1) 基本的O/R映射支持,使用DB First开发模式 EF 4 Visual Studio 2010 (.NET 4.0) 支持POCO实体 延迟加载 提高单元测试能力 自定义的代码生成机制 支持Model First开发模式 EF 4.1 NuGet 提供简化的DbContext接口 支持Code First开发模式 EF 4.1.1

第一篇:Entity Framework 简介

先从ORM说起吧,很多年前,由于.NET的开源组件不像现在这样发达,更别说一个开源的ORM框架,出于项目需要,以及当时OOP兴起(总不至于,在项目里面全是SQL语句),就自己开始写ORM框架.要开发ORM框架首先要了解ORM概念. ORM 对象关系映射,O(Object) 对象,在项目中就是实体,更加精确的来说就是数据Model,也可以说持久化类.R(Relation) 关系数据,M (Mapping)映射,将对象映射到关系数据,将关系数据映射到对象的过程. 更加直观理解就是,ORM 就是以OO

.Net单元测试之NMock

.Net单元测试之NMock NMock是一款.NET平台下的基于动态代理的Mock模拟对象类库,用于C#开发.Mock对象使测试更简单,它测试单个组件或单个类时不需要其它所有组件真正实现.也就是说我们可以仅仅只是测试一个类,NMock生成的模拟是通过在运行时使用动态代理来实现的,这允许模拟对象动态的定义,并不需要添加任何附加的类.         通常,一个模拟的实现基于被依赖的接口而创建:NMock支持对接口和类的模拟,另外它还支持属性模拟.比起测试一个完整的对象关系树更容易查清楚Bug.M

白盒测试实践项目计划与安排

本次白盒测试实践项目主要的任务有: 熟悉代码复审流程,利用阿里巴巴Java开发手册里面的代码评审标准对项目的源代码进行评审. 熟悉静态代码检查工具,并对系统进行静态代码检查 熟悉基于JUnit的单元测试脚本开发,并使用JUnit对代码进行白盒测试 使用Mock测试工具对代码进行Mock测试 此次白盒测试的应提交的文档与代码: 白盒测试方法部分 测试用例设计清单 代码复审部分 评审表 成员会议纪要及照片 评审结果报告 缺陷报告 静态代码检查工具部分 静态代码检查报告 JUnit单元测试部分 单元测