怎样使用PowerMockito 测试静态方法

PowerMockito 测试静态方法

假如有下面一个类DemoStatic,它里面定义了各种静态方法,这些静态方法可能是一些Utilities方法,辅助其它的类。

package mock.demo;
public class DemoStatic {
 public static String sayHello() {
  return "Hello";
 }

 public static String saySomething(String word) {
  return word;
 } 

 public static void sayAgain() {
  System.out.println(getMyWord());
 } 

 private static String getMyWord() {
  return "This is my word";
 }
}

首先

我们写一个测试类DemoStaticTest.java, 如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest({DemoStatic.class})
public class DemoStaticTest {
}

注意在类的前面要加这个annotation:

@PrepareForTest({DemoStatic.class})

其次

需要在你的项目中加入下面的maven依赖:

  <dependency>
   <groupId>org.powermock</groupId>
   <artifactId>powermock-api-mockito</artifactId>
   <version>1.4.10</version>
  </dependency>
  <dependency>
   <groupId>org.powermock</groupId>
   <artifactId>powermock-module-junit4</artifactId>
   <version>1.4.10</version>
  </dependency>

Mock 无参数的静态方法

 @Test
 public void testMockSayHello() {
  PowerMockito.spy(DemoStatic.class);
  PowerMockito.when(DemoStatic.sayHello()).thenReturn("my hello");

  System.out.println(DemoStatic.sayHello());  // my hello
 }

Mock 带参数的静态方法

 @Test
 public void testSaySomething() throws Exception {
  PowerMockito.spy(DemoStatic.class);
  PowerMockito.when(DemoStatic.class, "saySomething", Mockito.anyString()).thenReturn("something to say!");

  System.out.println(DemoStatic.saySomething("say hello")); //something to say!
 }

Mock private 静态方法

 @Test
 public void testMockPrivate() throws Exception {
  PowerMockito.spy(DemoStatic.class);
  PowerMockito.when(DemoStatic.class, "getMyWord").thenReturn("Nothing to say");

  DemoStatic.sayAgain(); //Nothing to say
 }

PowerMock 静态方法模拟问题排查,结果是函数参数问题

问题:静态方法User.convert()的模拟,未匹配到预期值。

1. 检查静态方法的模拟过程

Mocking Static Method:
// 1.类注解:@PrepareForTest(Static.class) //Static.class 是包含 static methods的类
方法内:
// 2.模拟静态类(使用PowerMockito.spy(class)模拟特定方法)
PowerMockito.mockStatic(Static.class);
// 3.拦截:设置期望值
Mockito.when(Static.firstStaticMethod(param)).thenReturn(value);

检查过程没问题。 直接拦截静态方法试试

2. 直接拦截静态方法

验证通过,模拟静态方法没问题。

3. 初步定义为参数问题:函数式参数

// 拦截的方法
<E, R> List<R> queryForList(Object var1, Class<E> var2, Function<E, R> var3);

Function类型的参数精确配置不应该 User::convert 这样传。那该怎么传呢?我在官网和百度扒资料,然而不知道是没有,还是没找对。反正,没找到该怎么解决。

没办法,只好先模糊匹配下了

4. 只匹配类型,算解决问题吗

花了时间不一定有收获,不花时间也许也有收获呢。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 深入学习Java单元测试(Junit+Mock+代码覆盖率)

    前言 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 1.接口功能测试:用来保证接口功能的正确性. 2.局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 1.比如变量有无初始值 2.变量是否溢出 3.边界条件测试 1.变量没有赋值(即为NULL) 2.变量是数值(或字符) 1.主要边界

  • 详解Java 中的UnitTest 和 PowerMock

    学习一门计算机语言,我觉得除了学习它的语法外,最重要的就是要学习怎么在这个语言环境下进行单元测试,因为单元测试能帮你提早发现错误:同时给你的程序加一道防护网,防止你的修改破坏了原有的功能:单元测试还能指引你写出更好的代码,毕竟不能被测试的代码一定不是好代码:除此之外,它还能增加你的自信,能勇敢的说出「我的程序没有bug」. 每个语言都有其常用的单元测试框架,本文主要介绍在 Java 中,我们如何使用 PowerMock,来解决我们在写单元测试时遇到的问题,从 Mock 这个词可以看出,这类问题主

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

    概述 当我们使用单元测试来验证应用程序代码时,如果代码中需要访问Redis,那么为了保证单元测试不依赖Redis,需要将整个Redis mock掉.在Spring Boot中结合mockito很容易做到这一点,如下代码: import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration

  • Java mockito单元测试实现过程解析

    待测试的服务接口: public interface ItemService { String getItemNameUpperCase(String itemId); } 预览 待测试的服务的实现类: @Service public class ItemServiceImpl implements ItemService { @Resource private ItemRepository itemRepository; @Override public String getItemNameU

  • 怎样使用PowerMockito 测试静态方法

    PowerMockito 测试静态方法 假如有下面一个类DemoStatic,它里面定义了各种静态方法,这些静态方法可能是一些Utilities方法,辅助其它的类. package mock.demo; public class DemoStatic { public static String sayHello() { return "Hello"; } public static String saySomething(String word) { return word; } p

  • Java 中的静态字段和静态方法 

    目录 一.静态变量 静态变量声明 静态变量测试 二.静态方法 静态方法测试 静态方法是如何工作的 为什么 Java Main 方法是静态方法 三.静态常量 四.总结 先看看下面这一串代码: public class Main {     public static void main(String[] args) {         System.out.println("Hello, WOrld!");     } } 我们的 ​​main​​ 方法被标记了 ​​static​​ 修

  • PHP基础教程(php入门基础教程)一些code代码

    在此教程之前,我就不长篇一律的说什么PHP的常用了. 关于什么是变量呀什么是判断语句呀什么的,请自行查询相关资料此教程值针对于有编程基础,且对PHP陌生的人看.文章比较简单.主要看结构.详细的还请大家自己多多研究 PHP环境安装: PHP通常组合是 :MySql+PHP+Apche 也有 IIS+PHP+MySQL或SqlServer 当然我们可以进行选择组合包来进行安装. 新手建议装AppServ或phpnow等. iis下可以用这个安装运行一下就支持php了,mysql需要安装一下. 也可以

  • Java单元测试Powermockito和Mockito使用总结

    目录 依赖引入 PowerMockito的使用 使用mockito来mock实例 mock对Redis的静态调用 mock单例类 mock私有方法 PowerMock跳过方法执行 总结 参考文档 最近公司在推进Java应用的单元测试,要求将单元测试的覆盖率提高到50%以上,保证上线代码充分自测.公司单元测试框架选用了Junit 4.12,Mock框架选用了Mockito和PowerMock,同时选用JaCoCo来做覆盖率检测,下面详细介绍一下我在使用这几个框架的一些经验. 依赖引入 <depen

  • DataList中TextBox onfocus调用后台void静态方法及获取相应行数

    昨天在某一论坛上看到的.Insus.NET尝试做了一下,算是练习了. Insus.NET的测试演示: xxx.aspx:  复制代码 代码如下: <asp:DataList ID="dlItemGeneral" runat="server" CellPadding="0" CellSpacing="0" Width="100%" OnItemDataBound="dlItemGeneral_

  • Java编程子类能否重写父类的静态方法探索

    今天突然讨论到了子类继承父类的静态方法问题,有人坚持说能写,有人说不能重写,那到底能不能冲写呢?这个问题很简单,测试一下就完了. 先是父类代码: public class Fu { public static void show() { System.out.println("父类的静态方法"); } public void method() { System.out.println("父类的一般方法"); } } 下面是子类代码: public class Zi

  • PHP类中Static方法效率测试代码

    类的定义如下: 复制代码 代码如下: class test { public static function a(){} public function b(){} } $obj = new test; 比较以下几种情况 test::a(); $obj->a(); $obj->b(); 测试代码: 复制代码 代码如下: $obj = new test; $test_times = 100; $times = 10000; $effi1 = array(); $effi2 = array();

  • PHP使用静态方法的几个注意事项

    本文实例介绍了PHP使用静态方法的几个常见注意事项.分享给大家供大家参考.具体方法如下: 1. 即使类中的方法并未用static声明,但其未使用到可改变的类成员变量,在外部仍可用操作符::来调用: 2. 以静态方式(用::操作符)调用的方法中$this的取值是由调用时的上下文决定的!而不是定义他的类!! 例如以下的代码: <?php class TestClass1 { public $normal_v = 'normal_v from TestClass1'; public static $S

  • java 反射 动态调用不同类的静态方法(推荐)

    准备调用的类 package ss; public class Use { public static Integer demo( String s ){ System.err.println(s+"<<<<<<成功!"); Integer ss=1; return ss; } } 执行调用的类 public class Ceshi { public static void main(String[] args) { try { String cla

  • 测试框架nunit之assertion断言使用详解

    任何xUnit工具都使用断言进行条件的判断,NUnit自然也不例外,与其它的xUnit(如Junit.phpUnit.pythonUnit)相比,由于大量使用了Generic.Attribute等语言特征,NUnit提供了更为方面.灵活的测试方法,下面先介绍一下断言. Nunit一共有四个类断言类,分别是Assert.StringAssert.FileAssert和DirectoryAssert,它们都在NUnit.Framework命名空间,其中Assert是常用,也是我们最熟悉的,而另外三个

随机推荐