【问题标题】:Springboot Integration Test - Unwanted MocksSpring Boot 集成测试 - 不需要的模拟
【发布时间】:2019-11-10 16:58:59
【问题描述】:

我正在尝试为 SpringBoot 应用程序编写集成测试。代码如下所示

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class, MyTestConfig.class})
@ActiveProfile("test")
class MyIntegrationTest {

@Autowire
ServiceInterface serviceA;

}

我注意到 applicationContext 将一些服务 bean 加载为 Mockito 模拟对象,这确实违背了集成测试的目的,因为它不执行某些代码。谁能建议这里可能有什么问题。请注意,某些服务已正确自动装配,但有些服务正在被模拟。我看不出它们行为不同的任何合乎逻辑的原因,因为它们的实现方式相同。我正在使用 Spring Boot 2.0.3

已经试过了。

删除了 MyTestConfig.class 但问题仍然存在。即使我使用@SpringBootTest(classes = {Application.class, MyProblematicServiceImpl.class}),它仍然会在自动装配的任何地方返回模拟对象。 MyProblematicServiceImpl 是用@Service 注释的空类。

【问题讨论】:

  • 您必须检查 Application.class 和 MyTestConfig.class,并查看 Mockito 模拟了哪些 bean。如果有 mockito 模拟,那是因为集成测试不想执行真正的服务。假设 mockito 模拟正在避免运行 3rd 方服务的测试......所以对于那个特定的测试,你可以避免这种情况并继续。一些集成测试只是想测试您的应用,而不涉及其他公司的服务。
  • 这是同一个内部服务,我不明白为什么 spring-boot 测试默认模拟它。如果我想模拟任何 bean,我会使用 @MockBean。我很难理解为什么有些课程不是全部都被嘲笑。如何让 spring-boot 避免模拟服务
  • MyTestConfig 类是什么样的? SpringBootTest 确实支持模拟服务,但它们必须被注释为 MockBean,除非在 Spring 中出现了可怕的错误。
  • 我删除了 MyTestConfig.class 但问题仍然存在。 MyTestConfig 类用于支持 Stub 实现,它只有一个 bean。我得到的问题不是同一个bean。即使我使用@SpringBootTest(classes = {Application.class, MyProblematicServiceImpl.class}),它仍然会在自动装配的任何地方返回模拟对象。 MyProblematicServiceImpl 是用@Service 注释的空类。
  • 我的猜测是应用程序会导致组件扫描,这会获取您拥有的测试配置。您可能需要排除一些测试配置。

标签: java spring spring-boot


【解决方案1】:

docs,如果你将SpringBootTest注解上的webEnvironment设置为MOCK以外的默认值,那么它将启动一个真正的web环境。

【讨论】:

  • 我注意到在文档中但使用 NONE 也不起作用
  • 我不想在 web 环境中运行,它是一种独立的应用程序
【解决方案2】:

从 cmets 推广,所以回答了。

应用程序会导致组件扫描,这会获取您拥有的测试配置。您可能需要排除一些测试配置。

Spring Boot 提供了@TestConfiguration 来解决这个问题。

【讨论】:

  • TestConfigutation 将不起作用,因为集成和单元测试都可以扫描相同的配置。我将适应不使用内部类进行测试配置,因为它隐藏了手动检查的内容
猜你喜欢
  • 2021-04-09
  • 2020-02-25
  • 1970-01-01
  • 2020-12-16
  • 2021-12-03
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
相关资源
最近更新 更多