(六)Mock泛型(类型变量)

本文介绍使用JMockit框架的两种方法来Mock接口AnOrdinaryInterface的泛型实例。第一种方法是通过MockUp的泛型功能,第二种方法则是使用@Capturing注解。这两种方法均可覆盖接口的所有实现,并改变其行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在JMockit基础知识中,我们学过可以用@Capturing用于对某个类或接口未来的实例进行Mock。

这里也可以利用MockUp的泛型(类型变量)Mock功能,一样可以达到某个类或接口未来的实例进行Mock的效果。只不过,我们可以享受

在MockUp中手工写Mock方法更直接的Mock方式。

以如何Mock接口中的AnOrdinaryInterface为例:

  • 第一种方法:Mock泛型
import mockit.Capturing;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Assert;
import org.junit.Test;

//第一种方法:Mock 泛型
public class GenericMockUpTest {
    @Test
    public <T extends AnOrdinaryInterface> void testMockUp(){
        //通过传给MockUp一个泛型类型变量,MockUp可以对这个类型变量的上限进行mock,
        // 以后所有这个上限的方法调用,就会走Mock后逻辑
        new MockUp<T>(){
            @Mock
            public int method1(){
                return 10;
            }
            @Mock
            public int method2(){
                return 20;
            }
        };
        //自定义一个AnordinaryInterface 的实现
        AnOrdinaryInterface instance1 = new AnOrdinaryInterface() {
            @Override
            public int method1() {
                return 1;
            }

            @Override
            public int method2() {
                return 1;
            }
        };
        // 再定义一个AnOrdinaryInterface的实现
        AnOrdinaryInterface instance2 = new AnOrdinaryInterface() {
            @Override
            public int method1() {
                return 2;
            }

            @Override
            public int method2() {
                return 2;
            }
        };

        //发现自定义的实现没有被作用,而是被Mock逻辑替代了
        Assert.assertTrue(instance1.method1() == 10);
        Assert.assertTrue(instance2.method1() == 10);
        Assert.assertTrue(instance1.method2() == 20);
        Assert.assertTrue(instance2.method2() == 20);
    }
 }
  • 第二种方法:用@capturing实现mock泛型
import mockit.Capturing;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Assert;
import org.junit.Test;

//第二种方法:其实用@capturing也是一样的效果
   public class GenericMockUpTest {
    @Test
    public <T extends AnOrdinaryInterface> void sameEffect(@Capturing AnOrdinaryInterface instance){
        new Expectations(){
            {
                instance.method1();
                result = 10;
                instance.method2();
                result = 20;

            }
        };
        //自定义一个AnOrdinaryInterface的实现
        AnOrdinaryInterface instance1 = new AnOrdinaryInterface() {
            @Override
            public int method1() {
                return 1;
            }

            @Override
            public int method2() {
                return 1;
            }
        };
        //再定义一个AnOrdinaryInterface的实现
        AnOrdinaryInterface instance2 = new AnOrdinaryInterface() {
            @Override
            public int method1() {
                return 2;
            }

            @Override
            public int method2() {
                return 2;
            }
        };
        //发现自定义的实现没有被作用,而是被Mock逻辑替代了
        Assert.assertTrue(instance1.method1() == 10);
        Assert.assertTrue(instance2.method1() == 10);
        Assert.assertTrue(instance1.method2() == 20);
        Assert.assertTrue(instance2.method2() == 20);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值