Spring Boot 中 Mockito.mock()、@Mock 和 @MockBean 注解的区别

1,503 阅读5分钟

什么是@Mock 注解?

@Mock 是 Mockito 库提供的注解,Mockito 库是一种流行的模拟框架,用于在 Spring Boot 应用程序中进行单元测试。它用于为不属于 Spring 上下文的依赖项创建模拟对象。 

@Mock注释通常与MockitoJUnitRunner或MockitoExtension 结合使用来初始化模拟对象。即使没有 Spring Framework,您也很有可能在编写单元测试时模拟对核心 Java 应用程序的依赖时使用了此注释。 

when ()方法用于定义 mock 对象的行为,verify() 方法用于验证在测试期间是否在 mock 对象上调用了某些方法。

什么是@MockBean注解?它有什么作用?

@MockBean是 Spring Boot 测试模块提供的特定于 Spring Boot 的注释。它用于为属于 Spring 上下文的依赖项创建模拟对象,例如在应用程序配置中声明的 beans 或由 Spring Boot 自动配置创建的 beans。@MockBean允许在单元测试期间用模拟对象替换实际的 bean。

什么是 Mockito.mock()?它有什么作用?

如果您之前使用过 Mockito,那么您可能熟悉此方法,但对于那些不熟悉的人,Mockito.mock() 是 Mockito 框架提供的方法,该框架是一种流行的基于 Java 的单元测试模拟框架。

它允许开发人员创建模拟对象,这些对象是模拟真实对象行为但没有实际实现逻辑的对象。Mock 对象在单元测试中用于将被测试代码与其依赖项隔离开来,从而使测试可以隔离执行,而不依赖于真正的外部组件。

Mockito.mock ()方法用于创建给定类或接口的模拟对象。它将类或接口作为参数并返回该类或接口的实例,其所有方法都以默认行为存根,例如返回 null、0 或空集合。然后,开发人员可以使用 Mockito 的 API 配置模拟对象的行为,以定义测试用例期间方法调用的特定期望和响应。

Spring Boot 中@Mock 和@MockBean 注解的区别

以下是 Spring Boot 和 Spring Framework 中 @Mock 和 @MockBean 注释之间的主要区别:

1. 上下文
@Mock用于模拟不属于 Spring 上下文的对象,而 @MockBean 用于模拟属于一部分的对象Spring上下文的。它用于带有 Mockito 框架的普通 JUnit 测试。它也不知道 Spring 上下文,通常用于单元测试隔离组件,而不需要完整的 Spring 上下文设置。

2. 与 Spring Boot 的集成
@MockBean是一个 Spring Boot 特定的注释,它提供与 Spring Boot 测试模块的集成,允许在 Spring Boot 应用程序中无缝模拟 Spring bean。

3. 初始化
@Mock需要使用 MockitoJUnitRunner 或 MockitoExtension 来初始化模拟对象,而@MockBean在测试上下文设置期间由 Spring Boot 测试框架自动初始化。

4. Bean替换
@MockBean在测试时将Spring上下文中的实际bean替换为mock对象,而@Mock不影响Spring上下文中的实际bean。

使用@Mock 和@MockBean 注解时要记住的事情 

在 Spring Boot 测试中使用 @Mock 和 @MockBean 注解时,需要牢记一些重要事项:

1.正确使用

@Mock 用于使用 Mockito 框架进行普通 JUnit 测试,而 @MockBean 用于 Spring Boot 测试以模拟 Spring 应用程序上下文的依赖关系。

2. 与Spring上下文集成

@MockBean 了解 Spring 上下文并允许模拟属于应用程序上下文的 beans,例如 @Service、@Repository 或 @Component 注释的 beans。另一方面,@Mock 不知道 Spring 上下文,用于单元测试隔离组件,而不需要完整的 Spring 上下文设置。

3.正确导入

@Mock 是从org.mockito 包中导入的,而@MockBean 是从org.springframework.boot.test.mock.mockito 包中导入的。确保为各自的用法导入正确的注解。

4. 正确设置

使用@MockBean 时,Spring Boot 会自动将 Spring 上下文中的实际 bean 替换为模拟 bean,从而允许进行适当的依赖注入。但是,对于 @Mock,模拟对象需要使用 @InjectMocks 注释或通过在测试设置中调用 MockitoAnnotations.initMocks(this) 手动注入到测试实例中。

5.重置模拟

@Mock 和@MockBean 都创建可用于定义模拟对象行为的模拟对象。在每次测试后重置模拟非常重要,以避免测试相互依赖并确保干净的测试执行。

6. 谨慎使用

应谨慎使用模拟,并且仅在必要时才使用。过度使用模拟会导致测试过于复杂并降低测试效率。在测试中使用模拟和真实依赖关系之间取得平衡以确保有意义和可靠的测试结果很重要。

7. 测试覆盖率

使用模拟时,请注意测试覆盖率。模拟不应该取代实际实现的真实测试。重要的是要在具有模拟的单元测试和具有真实依赖关系的集成测试之间取得平衡,以确保全面的测试覆盖率。

通过牢记这些注意事项,您可以在 Spring Boot 测试中有效地使用 @Mock 和 @MockBean 注释来创建模拟对象并有效地测试应用程序的行为和交互。

这就是Spring Boot 中 @Mock 和 @MockBean 注解的区别。请记住,  @Mock用于模拟不属于 Spring 上下文的对象,而@MockBean用于模拟属于 Spring Boot 应用程序中的 Spring 上下文的对象。@MockBean提供与 Spring Boot 测试框架的无缝集成,并允许在测试期间用模拟对象轻松替换实际 bean。