原 荐 单元测试时静态方法注意点

栏目: 编程工具 · 发布时间: 6年前

单元测试时静态方法注意点

  采蘑菇的大叔 发布于 今天 01:22

字数 848

阅读 8

收藏 0

Mockito Java PowerMock

开发十年,就只剩下这套 Java 开发体系了 >>> 原 荐 单元测试时静态方法注意点

Mockito 很强大, 但是它不支持静态方法.所以, 就用Powermock了. 要测试的对象是Controller中的接口, 对单元测试来说, 这个待测试的街口应该是一个白盒的. 所以, 其中的第三方(service,其他静态类)的调用都应该使用mock对象来stub起来. 下面是## 示例代码(随手写的,说明问题就行):

Controller:

@Controller
public class MainController {

    @Autowired
    private MainService mainService;

    @GetMapping("/hello")
    public String hello(){
        mainService.hello();
        String result = HelloUtil.hi();
        if(result.equals("hi")){
            return "ok";
        }else {
            return "fail";
        }

    }
}

Service:

/**
 * Created by icer on 2017/10/13.
 */
@Service 
public class MainService {

    public String hello(){
        System.out.println("hello");
        return "hello";
    }
}

Util静态类:  

```java
public class HelloUtil {

    public static String hi(){
        return "hi";
    }
}

我们要测试的是MainController中的hello方法.

再次注意, 是hello方法,不是hello接口.  我们的测试类:

@RunWith(PowerMockRunner.class)
@PrepareForTest(HelloUtil.class)
public class MainControllerTest {

    [@Mock](https://my.oschina.net/mock)
    private MainService mainService;

    @InjectMocks
    private MainController mainController;

    [@Test](https://my.oschina.net/azibug)
    public void helloTest(){
        PowerMockito.when(mainService.hello()).thenReturn("hello");
        PowerMockito.mockStatic(HelloUtil.class);
        PowerMockito.when(HelloUtil.hi()).thenReturn("hi");
        HelloUtil.hi();
        HelloUtil.hi();
        String result = mainController.hello();
        PowerMockito.verifyStatic(Mockito.times(3));
        HelloUtil.hi();
        HelloUtil.hi();
        HelloUtil.hi();
     // mainController.hello();
        assertEquals(result, "ok");
    }
}

我们着重看的是上面的HelloUtil.hi()方法.

PowerMockito.verifyStatic(Mockito.times(3));

先说下这句的意思, 这句(后面简称静态校验)就是对静态方法的调用次数做了校验. 光看命名就能想通. 但是要注意的是, 这里的3指的是在静态校验之前的调用次数. 如果静态校验执行的次数不等于这个次数, 那么静态校验后面的静态方法就不能再执行了. 上面代码中, 在这句前一共执行了三次HelloUtil.hi(); 两次是主动明文执行的, 一次是在mainController.hello()里面执行的. 如果注释掉某一个, 那么就会看到日志打印:

org.mockito.exceptions.verification.TooLittleActualInvocations: 
cn.com.hanbinit.utils.HelloUtil.hi();
Wanted 3 times but was 2 times.

这里只校验静态校验之前的执行次数, 后面执行多少次都没关系. 另外, 还有一点要注意的是, 在校验语句前, 我们前面给方法mock的返回值是有效的, 在校验之后就没效果了.

所以, 我们对静态方法的测试, 应该是放在verifyStatis之前进行的.  在校验之后的执行, 是为了证明我们之前的校验是ok的.

校验之后的静态方法调用, 是一定要有的. 要不然是测试不出调用次数的. 参见下面代码:

@Test
    public void helloTest(){
        PowerMockito.when(mainService.hello()).thenReturn("hello");
        PowerMockito.mockStatic(HelloUtil.class);
        PowerMockito.when(HelloUtil.hi()).thenReturn("hi");
        String result = HelloUtil.hi();
        String hi = HelloUtil.hi();
        PowerMockito.verifyStatic(Mockito.times(4));
        assertEquals(result, "hi");
    }

像上面这段代码, 测试是通过的.  改成下面这样:

@Test
    public void helloTest(){
        PowerMockito.when(mainService.hello()).thenReturn("hello");
        PowerMockito.mockStatic(HelloUtil.class);
        PowerMockito.when(HelloUtil.hi()).thenReturn("hi");
        String result = HelloUtil.hi();
        String hi = HelloUtil.hi();
        PowerMockito.verifyStatic(Mockito.times(4));
        HelloUtil.hi();
        assertEquals(result, "hi");
    }

就能看到日志:

org.mockito.exceptions.verification.TooLittleActualInvocations: 
cn.com.hanbinit.utils.HelloUtil.hi();
Wanted 4 times but was 2 times.

所以, 对静态方法调用次数的校验一定是verifyStatis和之后的显示调用一起来进行的. 最后的最后, 再提一句:  如果同时有多个静态方法调用. 如果都要验证调用次数, 那么应该分别像下面这样使用多次:

PowerMockito.verifyStatic(Mockito.times(4));
HelloUtil.hi();

[1]: https://blog.hanbinit.com.cn/usr/uploads/2017/10/12449159.png

原 荐 单元测试时静态方法注意点

© 著作权归作者所有

共有人打赏支持

上一篇: 由单体程序到微服务

下一篇: 浅谈敏捷

原 荐 单元测试时静态方法注意点

采蘑菇的大叔

原 荐 单元测试时静态方法注意点
原 荐 单元测试时静态方法注意点

参与源创会

“源创会”在线下联结了各位 OSCer,推广开源项目和理念,很荣幸有你的参与~

领取条件:参与过开源中国“源创会”的 OSCer 可以领取

粉丝 22

博文 9

码字总数 6396

作品 0

深圳

后端工程师

提问

相关文章 最新文章

Kotlin 写 Android 单元测试(三),Mockito mocking 框架的使用

Kotlin 写 Android 单元测试系列: Kotlin 写 Android 单元测试(一),单元测试是什么以及为什么需要 Kotlin 写 Android 单元测试(二),JUnit 4 测试框架和 kotlin.test 库的使用 Kotlin...

JohnnyShieh

2017/12/14

0

0

提升单元测试体验的利器--Mockito使用总结

为神马要使用Mockito? 在编写单元测试的时候,为了尽可能的保证隔离性,我们时常需要对某些不容易构造或者不容易获取或者对外部环境有依赖的对象,用一个虚拟的对象来创建以便于测试.假设你...

冬至饮雪

2017/06/06

0

0

使用Junit进行单元测试教程

软件测试的目的 什么是软件测试? 软件测试是 执行的软件以验证代码状态(state testing)或事件序列(behavior testing)符合预期 。 软件测试的作用 软件单元测试帮助开发人员验证程序的部分逻...

磁针石

2016/01/12

487

0

Java 单元测试及JUnit的使用

Java 单元测试: 单元测试是开发者编写的一小段代码,用于检测被测代码的一个很小的、很明确的功能是否正确。 单元测试的方法: 人工静态分析:人工阅读检测代码 自动静态分析:使用代码复查...

醉风林天

2017/05/09

0

0

说说在 Spring 中如何创建切面(AOP)

Spring 的增强提供了连接点的方位信息(织入方法前、方法后等),而切点则描述了增强需要织入到哪个类的哪一个方法上。 Spring 通过 Pointcut 来描述切点,它是由 ClassFilter 和 MethodMatc...

deniro

06/15

0

0

原 荐 单元测试时静态方法注意点

没有更多内容

加载失败,请刷新页面

加载更多
node安装cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

笑丶笑

27分钟前

3

0

OSChina 周三乱弹 —— 夜半回家,推门不动

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @胖达panda :分享陶晶莹/张雨生的单曲《我期待》 《我期待》- 陶晶莹/张雨生 手机党少年们想听歌,请使劲儿戳(这里) @cc_z :熬夜一时爽,...

小小编辑

39分钟前

324

9

原 荐 单元测试时静态方法注意点
验证码

response生成验证码 验证码的作用:防止恶意注册、攻击等 网站上看到的验证码,实际上都是一些图片,而这些图片都是程序(Servlet)生成的! package day19.test; import java.awt.Color; i...

码农屌丝

今天

1

0

day147-2018-11-14-英语流利阅读-待学习

《毒液》刚刚上映,创造漫威宇宙的人却走了 雪梨 2018-11-14 1.今日导读 中国的金庸创造了侠义英雄和江湖传奇,而大洋彼岸的斯坦·李也同样创造了一个绚烂璀璨的漫威宇宙,他构思的每个超级英...

飞鱼说编程

今天

16

0

CentOS 安装 PHP 5和PHP7

安装PHP5 下载解压二进制包 [root@test-a src]# cd /usr/local/src/[root@test-a src]# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2[root@test-a src]# tar jxvf php-5.6......

野雪球

今天

4

0

没有更多内容

加载失败,请刷新页面

加载更多

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro HTML5 and CSS3 Design Patterns

Pro HTML5 and CSS3 Design Patterns

Michael Bowers / Apress / 2011-11-15 / GBP 35.50

Pro HTML5 and CSS3 Design Patterns is a reference book and a cookbook on how to style web pages using CSS3 and HTML5. It contains 350 ready--to--use patterns (CSS3 and HTML5 code snippets) that you ca......一起来看看 《Pro HTML5 and CSS3 Design Patterns》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换