最近在工作中使用了用枚举实现的单例,那么如何对该种单例模式实现mock呢?
单例类如下(Singleton.class):
public enum Singleton {
INSTANCE;
Singleton() {
}
public int max(int a, int b) {
return a >= b ? a : b;
}
}
使用该单例类的类如下(SingletonHelper.class) :
public class SingletonHelper {
public int getMaxValue(int a, int b) {
return Singleton.INSTANCE.max(a, b);
}
}
相应的测试类如下(SingletonHelperTest.class):
@RunWith(PowerMockRunner.class)
@PrepareForTest({Singleton.class})
public class SingletonHelperTest {
private SingletonHelper singletonHelper;
@Mock
private Singleton singleton;
@Before
public void setUp()throws Exception {
singletonHelper =new SingletonHelper();
}
@Test
public void getMaxValue()throws Exception {
Whitebox.setInternalState(Singleton.class, "INSTANCE", singleton);
PowerMockito.when(singleton.max(Mockito.anyInt(), Mockito.anyInt())).then(returnsFirstArg());
Assert.assertEquals(2, singletonHelper.getMaxValue(2, 3));
}
}
此处先使用Whitebox.setInternalState对Singleton的字段"INSTANCE"进行反射,映射为singleton这个mock对象,后续就可以利用singleton对该单例类里面的方法进行mock了。
注意: 对max方法mock时的返回值returnsFirstArg(),是指使用调用该方法的第一个入参作为返回值,这种用法在mockito 1.9.5版本之后支持,以前的版本要想实现该方式必须手动实现Answer匿名类。
网友评论