@spy注解过的类,在没有设置模拟的返回值的时候,所有的方法都是真实方法,返回和真实方法的返回是一样的;而@Mock注解过的类,其所有的方法都是模拟的方法,如果没有设置模拟的返回值,就会返回null。 另外,@spy注解过的类进行方法的模拟时。一般使用下面这种格式:
Mockito.doReturn(yourResponse).when(yourService).yourMethod(yourRequest);@Mock注解的类一般都是使用下面这种格式:
Mockito.when(yourService.yourMethod(yourRequest)).thenReturn(yourResponse);一般我们都不会直接对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")); }}新闻热点
疑难解答