mockito使用

使用Mockito测试(依赖管理使用gradle)
依赖: mockito使用4.3.1 junit:5.8.2
testImplementation group: ‘org.mockito’, name: ‘mockito-core’, version: ‘4.3.1’
testImplementation group: ‘org.junit.jupiter’, name: ‘junit-jupiter-api’, version: ‘5.8.2’

// mockito的一个依赖,其中包含了mockito的原生依赖,内部可以mock静态方法,**注意和mockitod的依赖不能同时使用**

testImplementation group: ‘org.mockito’, name: ‘mockito-inline’, version: ‘4.3.1’

在使gradle的时候在settings中设置相关的一些参数
在这里插入图片描述
测试方式:
一、Mockito的方法
①在src文件夹下新创建一个java类,在类中写一个简单的方法;

public class Demo {
    public int sum(int a, int b) {
        return (a + b);
    }
}

②在编写代码的空白处右键,选择Genetate–>>Test…–>>member 勾选自己的方法然后ok,会在对应的测试包中生成测试类和测试方法

③在单元测试中模拟Demo对象,并使用未打桩的sum方法测试,使用Mockito的verify方法测试是否在使用该方法,并只运行了一次

    @Test
    void sum() {
        Demo demo = Mockito.mock(Demo.class);
        System.out.println(demo.sum(1,2));
        **Mockito.verify(demo,Mockito.timeout(1)).sum(1,2);**
    }

运行结果:(无报错说明测试通过,结果显示0,是因为为打桩的数据全部都是按照该类型的初始值赋值,sum(0,0))
在这里插入图片描述
④打桩,让固定方法返回固定数值 Mockito.when().thenReturn();
void sum() { Demo demo = Mockito.mock(Demo.class); **Mockito.when(demo.sum(1,2)).thenReturn(4)** System.out.println(demo.sum(1,2)) Mockito.verify(demo,Mockito.timeout(1)).sum(1,2); }在这里插入图片描述

⑤ 打桩,使用方法本身的逻辑运行Mockito.when().thenCallRealMethod(); 后面使用spy来创建对象就会走真正方法

  @Test
    void sum() {
        Demo demo = Mockito.mock(Demo.class);
        **Mockito.when(demo.sum(1,2)).thenCallRealMethod();**
        System.out.println(demo.sum(1,2));
        Mockito.verify(demo,Mockito.timeout(1)).sum(1,2);
    }

在这里插入图片描述
⑥ 打桩,抛出异常Mockito.when().thenThrow();

 @Test
    void sum() {
        **Mockito.when(demo.sum(1, 2)).thenThrow(RuntimeException.class);**
        System.out.println(demo.sum(1, 2));
        Mockito.verify(demo, Mockito.timeout(1)).sum(1, 2);
        Assertions.assertEquals(3, demo.sum(1, 2));
    }

在这里插入图片描述

⑦断言assertions Assertions.assertEquals(期待值,真实值);

 void sum() {
        Demo demo = Mockito.mock(Demo.class);
        Mockito.when(demo.sum(1,2)).thenCallRealMethod();
        System.out.println(demo.sum(1,2));
        Mockito.verify(demo,Mockito.timeout(1)).sum(1,2);
        **Assertions.assertEquals(3,demo.sum(1,2));**
    }

在这里插入图片描述
二、Mockito注解
① 注解Miock 用来mock对象对象

  @Mock
    private Demo demo;
MockitoAnnotations.openMocks(this);```

 ![在这里插入图片描述](https://img-blog.csdnimg.cn/04f15f06f391493487821ec2ff963971.png)
② BeforEach AfterEach 前置后置方法 前置方法用来mock对象,后置方法可以根据自己的需要来设置一些需要的东西

```clike
  @BeforeEach
    void setUp(){
        System.out.println("======开始前=====");
    }
``
 @AfterEach
    void after(){
        System.out.println("++结束了++");
    }`

![在这里插入图片描述](https://img-blog.csdnimg.cn/11d82be570fd4b8d8ab16aa80168a173.png)
③ spy(英语中是间谍的意思)用来mock对象和 @ Mock 方法相似
 a:spy出来的参数走对象真实的方法,mock出来的参数走默认值需要调用方法才会走真实的方法
 b:spy的参数是实例对象,mock的参数是类(Class)

```clike
    @Spy
    private Demo demo;

在这里插入图片描述
④injectMocks
把mock中的两个注入到spy中
在这里插入图片描述

三、使用mockitoInline来mock静态方法(需要使用mockitoInline的包来替换Mockito的依赖)
带有静态方法的静态类的创建
其中有一个IntStream.range(start, end).boxed().collect(Collectors.toList());
把int流包装成integer流并解析成list集合返回

public class StaticUtils {
    public static List<Integer> rang(int start, int end) {

        // IntStream.range(a,b)  IntStream是int类型的流 range(a,b)返回一个包含[a,b) 的有序的数字流。
        // .boxed() 将int类型的stream转成了Integer类型的Stream
        // getId 实体类属性的get方法 List<int> ids= userList.stream().map(User::getId).collect(Collectors.toList())
        // collect(Collectors.toList()) 把对应的int流解析放入list集合中
        return IntStream.range(start, end).boxed().collect(Collectors.toList());
    }

    public static String name() {
        return "zhe";
    }
}

①创建测试用的测试方法(有参数),记得用 try with resouirces包裹,结束时自动关闭,释放资源。

走真实的方法发现按照预期返回

 @Test
    void rang() {
        // 使用Mockito.mockStatic(Class)创建静态的mock对象,
        // 该方法中使用了threadLocal,使用try with resources包裹使用后关闭资源
        try (MockedStatic<StaticUtils> demo = Mockito.mockStatic(StaticUtils.class)) {

            // demo.when(()->StaticUtils.rang(2,5)).thenReturn(Arrays.asList(14,11,44));
            demo.when(() -> StaticUtils.rang(2, 6)).thenCallRealMethod();
            List<Integer> rang = StaticUtils.rang(2, 6);
            Assertions.assertTrue(StaticUtils.rang(2,6).contains(5));
        }
    }

在这里插入图片描述

② 创建测试用的测试方法(无参数),创建对象,对返回值打桩,判断。 测试通过

  @Test
    void name() {
        try (MockedStatic<StaticUtils> name = Mockito.mockStatic(StaticUtils.class)) {
            name.when(StaticUtils::name).thenReturn("hh");
            Assertions.assertEquals("hh",StaticUtils.name());
        }
    }

在这里插入图片描述

四、测试
①;测试的时候覆盖率显示
在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值