InjectMocks 怎么不执行自己内部的private方法
时间: 2024-09-30 21:16:30 浏览: 38
在使用Spring框架的`@InjectMocks`注解进行依赖注入并进行单元测试时,默认情况下,`@InjectMocks`会完全初始化所注入的对象,包括其私有方法。如果你不想让某个私有方法被执行,有两种常见的做法:
1. **使用`@Spy`和`@DoNotCallRealMethod`**:
使用`@Spy`标记私有方法所在的类,然后使用`@DoNotCallRealMethod`来指定该方法不应执行真实实现。例如:
```java
@SpyBean
private MyClass myClass = new MyClass(); // 使用SpyBean代替@InjectMocks
@Test
public void test() {
doNothing().doAnswer(invocation -> {}).when(myClass).privateMethodToSkip();
}
```
这样,`myClass.privateMethodToSkip()`将不会执行实际的代码逻辑。
2. **覆盖私有构造函数**:
如果`privateMethodToSkip`仅在构造函数中被调用,你可以自定义一个只包含你需要的初始化逻辑的构造函数,并在测试类中使用它,而不是`@InjectMocks`自动查找的那个构造函数。这可以防止私有方法的执行:
```java
@RunWith(SpringRunner.class)
@Autowired
class MyClassTest {
private final MyClass myClass; // 使用构造函数注入
MyClassTest(MyClass myClass) {
this.myClass = myClass;
// 防止内部私有方法执行
doNothing().when(myClass).privateMethodToSkip();
}
// ...其他测试方法...
}
```
注意:这种方法需要手动管理对象实例,而非自动注入。
阅读全文