mockito中spy 注解的原理和用法
时间: 2024-10-17 10:08:32 浏览: 24
`Mockito` 是一个流行的 Java 测试框架,它提供了模拟(mocking)和间谍(spying)的概念来帮助开发者进行单元测试。`@Spy` 是 Mockito 提供的一种注解,它的主要作用是在不改变原对象的基础上创建一个新的对象并将其行为进行“接管”。
**原理**:
当你使用 `@Spy` 时,Mockito 实际上不会创建一个新的对象,而是从原始对象那里克隆一个副本,然后对这个副本应用了 spy 的功能。这意味着,所有对原始对象的方法调用都会记录下来,并可以在测试中被拦截或替换。这样做的好处是可以保持原始对象不变,避免对实际业务逻辑产生影响。
**用法**:
1. **创建 Spy 对象**:
```java
MyClass original = new MyClass(); // 原始对象
MyClass spy = Mockito.spy(original); // 创建一个 spy 对象
```
2. **模拟方法的行为**:
使用 `doAnswer()`、`doThrow()` 或者 `when()` 方法来定义 spy 对象对特定方法的返回值、异常处理或行为模式。
```java
when(spy.someMethod()).thenReturn("mocked value"); // 返回假值
doThrow(new Exception()).when(spy).anotherMethod(); // 引发预设异常
```
3. **验证交互**:
可以在测试后检查 spy 是否按照预期被调用,例如:
```java
verify(spy).someMethod(); // 验证某个方法是否被调用
```
4. **还原原始行为**:
如果不需要继续跟踪 spy 的行为,可以使用 `verifyNoMoreInteractions(spy)` 来停止进一步的模拟。
```java
// 示例代码
public class MyClass {
public String someMethod() { return "real behavior"; }
}
@Test
public void testWithSpy() {
MyClass original = new MyClass();
MyClass spy = Mockito.spy(original);
String result = spy.someMethod(); // 实际调用的是 mock 的行为
assertEquals("mocked value", result); // 检查结果
verify(spy).someMethod(); // 验证 method 被调用
}
```
阅读全文