mockito

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

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

1、@Mock:

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

@Mock
private Context mockedObject;

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

2、@InjectMock:

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

@Mock
private Context mockedObject;

@InjectMock
private Res res = new Res();

这段代码中,@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();
    }
}
@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());

    }
}

以上面的例子,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注入到待处理的对象中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值