Java单元测试

如何对枚举类型实现的单例模式进行mock

2018-05-30  本文已影响0人  SeanPenn

最近在工作中使用了用枚举实现的单例,那么如何对该种单例模式实现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匿名类。

上一篇 下一篇

猜你喜欢

热点阅读