当前位置: 代码迷 >> 综合 >> 使用PowerMockito对静态方法进行Mock
  详细解决方案

使用PowerMockito对静态方法进行Mock

热度:29   发布时间:2024-01-31 18:26:10.0

对于静态方法,使用Mockito对其进行Mock时会报错,此时可以使用PowerMockito对其进行模拟:如

public class StaticMock {public static String trueMethod() {return "true";}public static String falseMethod() {return "false";}
}
public class MockitoDemo {public String trueMethod() {return StaticMock.trueMethod();}public String falseMethod() {return StaticMock.falseMethod();}
}

使用PowerMockito指定StringMethod的返回,主要分为四步:

1:使用@PrepareForTest注解注解静态方法所在的类@PrepareForTest(StaticMock.class),如果有多个,则用{}括起来,逗号分隔,如@PrepareForTest({StaticMock.class,StaticMock2.class})

@PrepareForTest(StaticMock.class)

2:使用@ObjectFactory指定ObjectFactory:

@ObjectFactory
public ITestObjectFactory getObjectFactory() {return new PowerMockObjectFactory();
}

3.使用PowerMockito初始化目标类,注意此初始化一定要放在initMocks之前,否则会报错

PowerMockito.mockStatic(StaticMock.class);
MockitoAnnotations.initMocks(this); // 要放到这个语句之前

4.使用PowerMockito进行Mock

PowerMockito.when(StaticMock.trueMethod()).thenReturn("false");

值得注意的是,使用@PrepareForTest注解标记的类,其内的所有方法如果不进行Mock,都会返回null(非原始数据类型),或初始值(原始数据类型)。如上面并没有Mock方法falseMethod。未使用注解时静态方法会返回false,但是使用@PrepareForTest(StaticMock.class)之后返回为null.

完整示例:

@PrepareForTest(StaticMock.class)
public class MockitoDemoTest {@InjectMocksMockitoDemo mockitoDemo;@ObjectFactorypublic ITestObjectFactory getObjectFactory() {return new PowerMockObjectFactory();}@BeforeMethodprivate void init() {PowerMockito.mockStatic(StaticMock.class);MockitoAnnotations.initMocks(this);}@Testpublic void stringMethodTest() {PowerMockito.when(StaticMock.trueMethod()).thenReturn("false");System.out.println(mockitoDemo.trueMethod()); // 返回falseSystem.out.println(mockitoDemo.falseMethod()); // 返回null}