PowerMock之Mock单例对象

背景

在使用PowerMock进行Mock对象来简化单元测试时,遇到单例的情况可能会出现空指针异常。情况如下:

原代码:

1
2
3
4
5
6
import SingletonA
public class Demo {
public int doTest() {
return SingletonA.getInstance().incr(1);
}
}

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
@RunWith(PowerMockRunner.class)
@PrepareForTest({SingletonA.class})
public class demoTest {

private Demo demo;

public void testDoTest() {
PowerMockito.mockStatic(SingletonA.class);
PowerMockito.when(SingletonA.getInstance().incr(Mockito.any())).thenReturn(1);
Assert.assertEquals(1, demo.doTest());
}
}

结果就运行异常,在

PowerMockito.when(SingletonA.getInstance().incr(Mockito.any())).thenReturn(1);

这句提示NullPointException。

解决办法

这里是由于Mock的是一个单例,获取之后其实是一个空的对象,那么自然没办法调用其方法(.incr())。

解决办法是先mock一个单例对象并返回,再对这个对象的方法进行模拟。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RunWith(PowerMockRunner.class)
@PrepareForTest({SingletonA.class})
public class demoTest {

private Demo demo;

@Mock
private SingletonA singletonA;

public void testDoTest() {
PowerMockito.mockStatic(SingletonA.class);
PowerMockito.when(SingletonA.getInstance()).thenReturn(singletonA);
PowerMockito.when(singletonA.incr(Mockito.any())).thenReturn(1);
Assert.assertEquals(1, demo.doTest());
}
}