Mockito的使用案例

流水线的单元测试 代码没有覆盖到,使用的是Mockito测试框架,原来是Mockito没有正确使用

package com.hmdp;

import com.hmdp.controller.BlogController;
import com.hmdp.entity.Blog;
import com.hmdp.service.IBlogService;
import com.hmdp.service.impl.BlogServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author: ldj
 * @Date: 2023/07/05/20:39
 * @Description: Mockito 测试案例
 */
@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class MockitoTest {

    //我是主对象
    @InjectMocks
    private BlogController blogController = new BlogController();

    //我是依赖对象,将被注入到主对象
    @Mock
    private IBlogService blogService = new BlogServiceImpl();

    @Test
    public void saveBlogTest(){
        Blog blog = new Blog();
        blog.setId(4657558585L);
        blog.setName("java入门到进阶");
        blogController.saveBlog(blog);
    }
}

后续补充:

package com.dj.springtest.mock;

/**
 * User: ldj
 * Date: 2023/7/17
 * Time: 23:38
 * Description: No Description
 */
public class MockService {

    public int add(int a, int b) {
        return a + b;
    }
}
package com.dj.springtest.mock;

/**
 * User: ldj
 * Date: 2023/7/17
 * Time: 23:48
 * Description: No Description
 */
public interface IMockService {

    default String write(Integer num) {
        if (num != null && num == 1) {
            return "hello i am Mockito";
        } else {
            return "big error";
        }
    }
}

package com.dj.springtest.mockitoTest;

import com.dj.springtest.mock.IMockService;
import com.dj.springtest.mock.MockService;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;

/**
 * User: ldj
 * Date: 2023/7/17
 * Time: 23:41
 * Description: No Description
 */

//@RunWith(MockitoJUnitRunner.class)
public class MockServiceTest {
    
    @Spy //默认使用无参构造创建对象,没有需要显性手动new有参构造器
    private MockService mockService1 = new MockService(0);

    @Mock
    private MockService mockService2;

    @Spy //这是接口默认方法
    private IMockService iMockService;

    @Before
    public void setUp(){
        //junit新版是openMock(),而且注解名称是@BeforeEach
        //该方法可由@RunWith(MockitoJUnitRunner.class)代替,省去不写
        System.out.println("-------测试开始-------");
        MockitoAnnotations.initMocks(this);
    }

    @After
    public void end(){
        System.out.println("-------测试结束-------");
    }

    @Test
    public void add1(){
        System.out.println(mockService1.addition(1, 1)); //真实值2
        Assert.assertEquals(2,   mockService1.addition(1, 1));
    }

    @Test
    public void add2(){
        System.out.println(mockService2.addition(1, 1)); //初始值0
        Assert.assertEquals(0,   mockService2.addition(1, 1));
    }

    //结论:  @Spy调用真实方法,而 @Mock只是一个虚拟对象不具备方法行为

    @Test
    public void write(){
        System.out.println(iMockService.write(1));
        //Mockito.when(iMockService.write(1)).thenReturn("Mockito"); 打桩定义返回值,断言将报错
        Assert.assertEquals("hello i am Mockito",  iMockService.write(1));
    }

    @Test
    public void division(){
        //模拟抛出异常
        Mockito.when(mockService1.division(6, 5)).thenThrow(ArithmeticException.class);

        //@Mock对象模拟走真实方法
        Mockito.when(mockService2.division(6, 2)).thenCallRealMethod();
        Assert.assertEquals(mockService1.division(6, 2), mockService2.division(6, 2));
    }

}

后续补充: if分支里面的判断,代码无法覆盖问题,如果是参数问题

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值