@Mock 和 @InjectMocks
时间: 2024-11-27 17:13:56 浏览: 21
在Mockito库中,`@Mock`和`@InjectMocks`是两个非常重要的注解,它们常用于编写单元测试。
1. **@Mock**:这个注解用于声明一个字段为一个Mock对象。Mock对象是一个已知的、不可变的、预设行为的实例。当你在测试中创建一个Mock对象时,Mockito允许你预先定义它的行为,比如返回特定值,抛出异常,或者记录调用。这对于需要控制某些复杂依赖的行为很有帮助,尤其是在处理协作对象或远程服务的时候。
```java
@Mock
private SomeService service;
```
2. **@InjectMocks**:这个注解用于标记你要测试的类,它会自动将该类的所有非静态的、无final修饰并且没有`@Mock`或`@Spy`注解的成员变量注入实际的实例(而不是Mock)。这意味着你可以直接对那些被`@InjectMocks`标注的类进行测试,而不需要手动创建所有的依赖对象。
```java
@InjectMocks
private MyClassToTest myClassToTest;
```
结合使用时,通常是先创建Mock对象来控制依赖,然后使用`@InjectMocks`来测试目标类的行为。这样可以在不改变目标类的情况下检查其功能是否正常。
相关问题
@injectmocks和@mock
@injectmocks和@mock是Mockito框架中的注解,用于进行单元测试时的模拟对象注入。
@mock注解用于创建一个模拟对象,可以模拟一个类或接口的行为,从而在测试过程中替代真实的对象。
@injectmocks注解用于将模拟对象注入到被测试对象中,从而在测试过程中使用模拟对象替代真实的对象,以便进行测试。
这两个注解的使用可以帮助我们进行更加灵活、高效的单元测试,提高代码的质量和可维护性。
@InjectMocks mock子方法
如果被@InjectMocks注解的类中有一个需要mock的子方法,可以使用Mockito的Spy对象来部分mock该对象的行为,同时保留其它方法的真实行为。
举个例子,我们有一个被@InjectMocks注解的类A,其中包含一个子方法B,我们想要mock子方法B的行为,同时保留其它方法的真实行为,可以按如下方式进行:
```
public class A {
public int add(int a, int b) {
return a + b;
}
public int multiply(int a, int b) {
return a * b;
}
public int calculate(int a, int b) {
int sum = add(a, b);
int product = multiply(a, b);
return sum + product;
}
}
public class ATest {
@InjectMocks
private A a;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testCalculate() {
A spyA = Mockito.spy(a);
Mockito.doReturn(10).when(spyA).add(Mockito.anyInt(), Mockito.anyInt());
int result = spyA.calculate(2, 3);
Assert.assertEquals(result, 26);
}
}
```
在这个例子中,我们使用@Spy注解将类A的对象spyA进行部分mock,然后使用Mockito.doReturn()方法来模拟spyA对象的add()方法返回10,这样在调用calculate()方法时,add()方法会返回10,multiply()方法会返回6,最终返回的结果为16+10=26。需要注意的是,我们使用的是spyA对象而非a对象来进行mock,以保留其它方法的真实行为。
阅读全文