当前位置:   article > 正文

mockito_@injectmocks 会连接数据库吗

@injectmocks 会连接数据库吗

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注入到待处理的对象中。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号