对于静态方法,使用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 {
@InjectMocks
MockitoDemo mockitoDemo;
@ObjectFactory
public ITestObjectFactory getObjectFactory() {
return new PowerMockObjectFactory();
}
@BeforeMethod
private void init() {
PowerMockito.mockStatic(StaticMock.class);
MockitoAnnotations.initMocks(this);
}
@Test
public void stringMethodTest() {
PowerMockito.when(StaticMock.trueMethod()).thenReturn("false");
System.out.println(mockitoDemo.trueMethod()); // 返回false
System.out.println(mockitoDemo.falseMethod()); // 返回null
}