赞
踩
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的值。
其他:
@Mock创建的是全部mock的对象,既在对具体的方法打桩之前,mock对象的所有属性和方法全被置空(0或者null);与之对应的是@Spy这个注解,@Spy可以创建部分mock的对象,部分mock对象的所有成员方法都会按照原方法的逻辑执行,直到被打桩返回某个具体的值。@Mock和@Spy才是两个具有可比性的概念。
Mokcito的mock()方法功能与@Mock相同,只是使用方式和场景不同。同样的,@Spy也对应一个spy()方法。
@Mock和@Spy注解的对象,均可被@InjectMock注入到待处理的对象中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。