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

    xiaoxiao2021-03-25  12

    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")); } }
    转载请注明原文地址: https://ju.6miu.com/read-300318.html

    最新回复(0)