• Mockito (六)


    Mockito 参数匹配

    精确匹配

    我们之前介绍过这样的例子:

    import org.junit.Assert;
    import org.junit.Test;
    
    import java.util.List;
    
    import static org.mockito.Mockito.*;
    
    public class MockitoDemo {
    
    
        @Test
        public void test() {
            List mockList = mock(List.class);
    
            Assert.assertEquals(0, mockList.size());
            Assert.assertEquals(null, mockList.get(0));
    
            mockList.add("a");  // 调用 mock 对象的写方法,是没有效果的
    
            Assert.assertEquals(0, mockList.size());      // 没有指定 size() 方法返回值,这里结果是默认值
            Assert.assertEquals(null, mockList.get(0));   // 没有指定 get(0) 返回值,这里结果是默认值
    
            when(mockList.get(0)).thenReturn("a");          // 指定 get(0)时返回 a
    
            Assert.assertEquals(0, mockList.size());        // 没有指定 size() 方法返回值,这里结果是默认值
            Assert.assertEquals("a", mockList.get(0));      // 因为上面指定了 get(0) 返回 a,所以这里会返回 a
    
            Assert.assertEquals(null, mockList.get(1));     // 没有指定 get(1) 返回值,这里结果是默认值
        }
    }

    其中when(mockList.get(0)).thenReturn("a"); 指定了get(0)的返回值,这个 0 就是参数的精确匹配。我们还可以让不同的参数对应不同的返回值,例如:

    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.mockito.Mock;
    import org.mockito.MockitoAnnotations;
    
    import java.util.List;
    
    import static org.mockito.Mockito.*;
    
    public class MockitoDemo {
    
        @Mock
        private List<String> mockStringList;
    
        @Before
        public void before() {
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void test() {
    
            mockStringList.add("a");
    
            when(mockStringList.get(0)).thenReturn("a");
            when(mockStringList.get(1)).thenReturn("b");
    
            Assert.assertEquals("a", mockStringList.get(0));
            Assert.assertEquals("b", mockStringList.get(1));
    
        }
    
    }

    对于精确匹配,还可以用 eq,例如:

    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.mockito.Mock;
    import org.mockito.MockitoAnnotations;
    
    import java.util.List;
    
    import static org.mockito.Mockito.*;
    
    public class MockitoDemo {
    
        @Mock
        private List<String> mockStringList;
    
        @Before
        public void before() {
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void test() {
    
            mockStringList.add("a");
    
            when(mockStringList.get(eq(0))).thenReturn("a");  // 虽然可以用eq进行精确匹配,但是有点多余
            when(mockStringList.get(eq(1))).thenReturn("b");
    
            Assert.assertEquals("a", mockStringList.get(0));
            Assert.assertEquals("b", mockStringList.get(1));
    
        }
    
    }

    模糊匹配

    可以使用 Mockito.anyInt() 匹配所有类型为 int 的参数:

    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.mockito.Mock;
    import org.mockito.MockitoAnnotations;
    
    import java.util.List;
    
    import static org.mockito.Mockito.*;
    
    public class MockitoDemo {
    
        @Mock
        private List<String> mockStringList;
    
        @Before
        public void before() {
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void test() {
    
            mockStringList.add("a");
    
            when(mockStringList.get(anyInt())).thenReturn("a");  // 使用 Mockito.anyInt() 匹配所有的 int
    
            Assert.assertEquals("a", mockStringList.get(0)); 
            Assert.assertEquals("a", mockStringList.get(1));
    
        }
    
    }

    anyInt 只是用来匹配参数的工具之一,目前 mockito 有多种匹配函数,部分如下:

    函数名匹配类型
    any() 所有对象类型
    anyInt() 基本类型 int、非 null 的 Integer 类型
    anyChar() 基本类型 char、非 null 的 Character 类型
    anyShort() 基本类型 short、非 null 的 Short 类型
    anyBoolean() 基本类型 boolean、非 null 的 Boolean 类型
    anyDouble() 基本类型 double、非 null 的 Double 类型
    anyFloat() 基本类型 float、非 null 的 Float 类型
    anyLong() 基本类型 long、非 null 的 Long 类型
    anyByte() 基本类型 byte、非 null 的 Byte 类型
    anyString() String 类型(不能是 null)
    anyList() List<T> 类型(不能是 null)
    anyMap() Map<K, V>类型(不能是 null)
    anyCollection() Collection<T>类型(不能是 null)
    anySet() Set<T>类型(不能是 null)
    any(Class<T> type) type类型的对象(不能是 null)
    isNull() null
    notNull() 非 null
    isNotNull() 非 null

    转载:https://www.letianbiji.com/java-mockito/mockito-parameter-match.html

    带着疑问去思考,然后串联,进而归纳总结,不断追问自己,进行自我辩证,像侦查嫌疑案件一样看待技术问题,漆黑的街道,你我一起寻找线索,你就是技术界大侦探福尔摩斯
  • 相关阅读:
    Android SurfaceView实战 带你玩转flabby bird (上)
    linux释放内存的命令
    Linux上的free命令详解
    app后端设计(14)--LBS的偏移问题
    包床、退床
    oracle学习17
    提示在【办公管理】-->【今日工作】
    oracle学习16
    数据库的表信息
    CodeForces
  • 原文地址:https://www.cnblogs.com/cainiao-Shun666/p/14804767.html
Copyright © 2020-2023  润新知