美文网首页Java单元测试
如何对枚举类型实现的单例模式进行mock

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

作者: SeanPenn | 来源:发表于2018-05-30 00:35 被阅读0次

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

    相关文章

      网友评论

        本文标题:如何对枚举类型实现的单例模式进行mock

        本文链接:https://www.haomeiwen.com/subject/hxbzjftx.html