利用Mockito进行单元测试[1]-{各种笔记}

1. @spy和@Mock的区别

@spy注解过的类,在没有设置模拟的返回值的时候,所有的方法都是真实方法,返回和真实方法的返回是一样的;而@Mock注解过的类,其所有的方法都是模拟的方法,如果没有设置模拟的返回值,就会返回null。
另外,@spy注解过的类进行方法的模拟时。一般使用下面这种格式:

Mockito.doReturn(yourResponse).when(yourService).yourMethod(yourRequest);

@Mock注解的类一般都是使用下面这种格式:

Mockito.when(yourService.yourMethod(yourRequest)).thenReturn(yourResponse);

2.使用@InjectMocks对依赖的类进行自动注入

一般我们都不会直接对Mock的类进行测试,因为那样的测试结果都是设定的。我们会对调用外部服务的类进行mock,并对接受这个类的返回并进行处理的类进行单元测试。这时就需要@InjectMocks这个注解了。
比如说类MyService.java是调用外部服务的类,MyCalc.java是接收外部服务的返回并进行处理的类。实现代码如下:

public class MyService{
    public int sendRequest(String req){
        int rsp = 0;
        //调用外部服务并收到返回结果
        return rsp;
    }
}
public class MyCalc{
    @Autowired
    private MyService myService;

    public int calc(String s1 , String s2){
        int a = myService.sendRequest(s1);
        int b = myService.sendRequest(s2);
        return a+b;
    }
}

如果测试类这样写:

public class MyTest{
    @Spy
    private MyService myService;

    @Test
    public void testAAddB(){
        Mockito.doReturn(3).when(myService).sendRequest("1");
        MyCalc myCalc = new MyCalc();
        System.out.println(myCalc.calc("1","2"));
    }
}

在运行的时候会报空指针的错误。因为MyService这个类没有初始化。
所以需要对类MyCalc进行InjectMocks的注解。
改为以下的输出就是正常的5了。

public class MyTest{
    @Spy
    private MyService myService;
    @InjectMocks
    private MyCalc myCalc;

    @Test
    public void testAAddB(){
        Mockito.doReturn(3).when(myService).sendRequest("1");

        System.out.println(myCalc.calc("1","2"));
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值