好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

怎样使用PowerMockito 测试静态方法

PowerMockito 测试静态方法

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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, 如下:

?

1

2

3

4

@RunWith (PowerMockRunner. class )

@PrepareForTest ({DemoStatic. class })

public class DemoStaticTest {

}

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

?

1

@PrepareForTest ({DemoStatic. class })

其次

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

?

1

2

3

4

5

6

7

8

9

10

< 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 无参数的静态方法

?

1

2

3

4

5

6

7

@Test

public void testMockSayHello() {

  PowerMockito.spy(DemoStatic. class );

  PowerMockito.when(DemoStatic.sayHello()).thenReturn( "my hello" );

 

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

}

Mock 带参数的静态方法

?

1

2

3

4

5

6

7

@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 静态方法

?

1

2

3

4

5

6

7

@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. 检查静态方法的模拟过程

?

1

2

3

4

5

6

7

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. 初步定义为参数问题:函数式参数

?

1

2

// 拦截的方法

<E, R> List<R> queryForList(Object var1, Class<E> var2, Function<E, R> var3);

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

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

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

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

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

原文链接:https://blog.csdn.net/west_609/article/details/74906491

查看更多关于怎样使用PowerMockito 测试静态方法的详细内容...

  阅读:20次