文档章节

PowerMock和Mockito来mock

y
 yangming0322
发布于 2016/09/20 13:55
字数 647
阅读 240
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参...

时间 2015-06-16 21:15:05  BlogJava-技术区

原文  http://www.blogjava.net/usherlight/archive/2015/06/16/425740.html

主题 Java

本文将简单介绍如何使用PowerMock和Mockito来mock

1. 构造函数

2. 静态函数

3. 枚举实现的单例

4. 选择参数值做为函数的返回值

一点简要说明:Mockito其实已经可以满足大部分的需求,但是它的实现机制是使用cglib来动态创建接口的类的实例。但是这种实现方式不能用于构造函数和静态函数,因为那需要使用类的字节码(比如使用javassist). 所以我们才需要结合使用PowerMock.

1. mock构造函数, 如果有代码没有使用DI注入依赖实例,在单元测试中可以使用PowerMock来模拟创建对象。

注意的开始两行的2个注解 @RunWith 和 @PrepareForTest

@RunWith比较简单,后面始终是PowerMockRunner.class

@PrepareForText后面需要加的是调用构造函数的类名,而不是有构造函数的类本身。

在下面的例子中,我们要测试的类是:Helper, 在Helper类中调用了Somthing类的构造函数来创建实例。

@RunWith(PowerMockRunner. class

)

@PrepareForTest(Helper.

class

)

public   class

HelperTest {

@Mock

 

private

Something mockSomething;

@InjectMocks

 

private

Helper helper;

@Test

 

public   void  doSomething()  throws

Exception {

String argument 

=   " arg "

;

PowerMockito.whenNew(Something.

class

).withArguments(argument).thenReturn(mockSomething);

// 调用需要测试方法

helper.doSomething(argument);

// 进行验证

verify(mockSomething).doIt();

}

}

public class Helper {

public void doSomething(String arg) {

Something something = new Something(arg);

something.doit();

}

}

 

2,mock 静态函数, 单例模式就是一个典型的会调用静态函数的例子。 注意要点与mock构造函数相同。

class

ClassWithStatics {

 

public   static

String getString() {

 

return   " String "

;

}

 

public   static   int

getInt() {

 

return   1

;

}

}

@RunWith(PowerMockRunner.

class

)

@PrepareForTest(ClassWithStatics.

class

)

public   class

StubJustOneStatic {

@Test

 

public   void

test() {

PowerMockito.mockStatic(ClassWithStatics.

class

);

when(ClassWithStatics.getString()).thenReturn(

" Hello! "

);

System.out.println(

" String:  "   +

ClassWithStatics.getString());

System.out.println(

" Int:  "   +

ClassWithStatics.getInt());

}

}

 

3。mock枚举实现的单例

SingletonObject.java

public enum SingletonObject {     
    INSTANCE; 
    private int num; 

    protected void setNum(int num) { 
        this.num = num; 
    } 

    public int getNum() { 
        return num; 
    } 
}

SingletonConsumer.java

public class SingletonConsumer {

    public String consumeSingletonObject() { 
        return String.valueOf(SingletonObject.INSTANCE.getNum()); 
    } 
}




  

SingletonConsumerTest.java

@RunWith(PowerMockRunner.class) 
@PrepareForTest({SingletonObject.class}) 
public class SingletonConsumerTest { 
    @Test public void testConsumeSingletonObject() throws Exception { 
        SingletonObject mockInstance = mock(SingletonObject.class); 
        Whitebox.setInternalState(SingletonObject.class, "INSTANCE", mockInstance);          

        when(mockInstance.getNum()).thenReturn(42);          
        assertEquals("42", new SingletonConsumer().consumeSingletonObject()); 
    } 
}

4。返回参数值做为函数返回值。

mockito 1.9.5之后,提供一个方便的方法来实现这个需要,在这之前可以使用一个匿名函数来返回一个answer来实现。

when(myMock.myFunction(anyString())).then(returnsFirstArg());

其中returnsFirstArg()是org.mockito.AdditionalAnswers中的一个静态方法。

在这个类中还有其他的一些类似方法

returnsSecondArg()

returnsLastArg()

ReturnsArgumentAt(int position)

本文转载自:http://www.blogjava.net/usherlight/archive/2015/06/16/425740.html

y
粉丝 0
博文 17
码字总数 6387
作品 0
西城
高级程序员
私信 提问
加载中

评论(1)

TonyStarkSir
TonyStarkSir
博主,请问被测的类中如果有事务怎么处理,我这边用mock的时候含有事务mock就会失效,我的问题详细地址:https://www.oschina.net/question/2722357_2209501
解决 Spock 与 PowerMock 的集成问题

在前一篇文章中,提到了如何在 Spock 中测试 Static 的 Method,以弥补 Spock 在这个部份的不足。当时使用的是 PowerMock 1.6.2,只不过随着时间的推移,最新的 Mockito 与 PowerMock 组合,...

_WZ_
2017/06/02
0
0
单元测试mock框架——使用JMockit编写java单元测试

JMockit是基于JavaSE5中的java.lang.instrument包开发,内部使用ASM库来动态修改java的字节码,使得java这种静态语言可以想动态脚本语言一样动态设置被Mock对象私有属性,模拟静态、私有方法...

郑加威
2017/01/18
0
0
SpringBoot2单元测试

引入maven依赖 引入powermock是为了解决静态方法mock的问题。 构建单元测试目录 标准的maven单元测试目录一样,在resources目录里面添加application.yml内容如下: 定义Application入口类 抽...

一刀
10/15
57
0
无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类

1、为什么要用mock 我的一本书的解释:   (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据   (2)调用第三方API接口,测试很慢,   (3)编写满足所有外部依...

BIM开发
2018/07/30
0
0
springside-4.0.0.RC2 快速start 出错

[ERROR] Failed to execute goal on project springside-extension: Could not resolv e dependencies for project org.springside:springside-extension:jar:4.0.0.RC2: Fa iled to collect......

yiliu
2012/03/31
673
3

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 我的视频网站vip账号和我厚脸皮的朋友们

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Cobbage :分享小海的单曲《衡山路(2016现场版)》: 《衡山路(2016现场版)》- 小海 手机党少年们想听歌,请使劲儿戳(这里) @FalconChe...

小小编辑
30分钟前
4
0
Spring Cloud Alibaba 实战(十二) - Nacos配置管理

> 本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理的意义 项目...

JavaEdge
今天
8
0
面试官问你编码相关的面试题,把这篇甩给他就完事!

前情回顾:Java中一个字符占两字节 但为什么new String("字").getBytes().length 返回3个字节 今天主要聊一聊: 字节 字符 字符集 编码 字符编码 Java 内码和外码 Unicode 字节 例如 :00001...

gzc426
今天
9
0
写的简单sh脚本2

#!/bin/bashexport LANG="en_US.UTF-8"#chmod +x filename 记得给文件加可执行权限#./vsimstart.sh#启动vsim项目echo "start vism"#207------------------------------assets=vsim-a......

hexiaoming123
昨天
6
0
java基础(1)变量和常量

概要和总结: 数据类型图: 基本数据类型:只有基本功能-----保存数据 (4类8种)byte-short-int-long-float-double-char-boolean 引用数据类型:有更多功能,保存数据,处理数据...

煌sir
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部