首页 > 学院 > 开发设计 > 正文

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

2019-11-08 03:27:10
字体:
来源:转载
供稿:网友

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")); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表