• mockito


    mockito类最常见于java的测试类中,用来mock数据。
    需要了解其最常见的注解:
    @Mock和@InjectMock。

    介绍之前,首先要明确一点:@Mock和@InjectMock这两个注解除了名字和使用方式比较像之外,是在功能上无任何可类比性的完全不同的东西。

    1、@Mock:

    在Mockito中用于创建mock对象,使用方法如下:

    @Mock
    private Context mockedObject;
    
    • 1
    • 2

    上面代码创建了一个名为mockedObject,类型为Context的mock对象,该对象所有的方法被置空!!!,根据测试代码逻辑的需要使用

    2、@InjectMock:

    这是一个注入mock对象的操作,参考如下代码:

    @Mock
    private Context mockedObject;
    
    @InjectMock
    private Res res = new Res();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这段代码中,@InjectMock下面声明了一个待测试的对象,若该对象有类型为Context的成员变量,@Mock定义的mock对象将会被注入到这个待测试的对象中,既Res的类型为Context的成员被直接赋值为mockedObject。(多用于本地测试的时候,模拟数据库中的查询结果等)
    injectmock可以实现依赖注入!!!


    一般来讲:mock的对象是injectMock的对象中的一个属性!!!且在实际mock的时候,使用when…thenRetrun…的方式来进行mock测试

    public class Student {
        private Grade grade;
    
        public Student(Grade grade) {
            this.grade = grade;
        }
    	
    	//getGrade()方法中调用了grade.getGradeName()方法
        public String getGrade(){
            return "student belong to:" + grade.getGradeName();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    @RunWith(MockitoJUnitRunner.class)
    class StudentTest {
      
        @Mock
        Grade grade;
    
        @InjectMocks
        Student student;
    
        @Test
        void getGrade() {
            when(grade.getGradeName()).thenReturn(" 2 grade ");
            assertEquals("Student belong to: 2 grade",student.getGrade());
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    以上面的例子,Grade对象是Student对象中的一个属性,在@Test中,使用了when(grade.xxx).thenRetrun(xxx),来进行打桩,然后在student.getGrade()调用的时候【getGrade()方法中调用了grade.getGradeName()方法】,会取出mock的值。

    其他:

    1. @Mock创建的是全部mock的对象,既在对具体的方法打桩之前,mock对象的所有属性和方法全被置空(0或者null);与之对应的是@Spy这个注解,@Spy可以创建部分mock的对象,部分mock对象的所有成员方法都会按照原方法的逻辑执行,直到被打桩返回某个具体的值。@Mock和@Spy才是两个具有可比性的概念。

    2. Mokcito的mock()方法功能与@Mock相同,只是使用方式和场景不同。同样的,@Spy也对应一个spy()方法。

    3. @Mock和@Spy注解的对象,均可被@InjectMock注入到待处理的对象中。

  • 相关阅读:
    Callble接口创建多线程【详细总结】
    基于增强蛇优化算法求解单目标优化问题附matlab代码
    在线人才测评,招聘技术研发类岗位的人才测评方案
    【LeetCode周赛】LeetCode第365场周赛
    【毕业设计】深度学习人体语义分割在弹幕防遮挡上的实现 - python
    LeetCode_字符串反转_简单_557. 反转字符串中的单词 III
    vue 学习 -- day36(分析工程结构)
    伦敦金的交易时间究竟多长?
    轻量级xshell+manager远程监控jvisualvm
    Java:使用StopWatch统计程序执行耗时
  • 原文地址:https://blog.csdn.net/qq_45009980/article/details/127992767