【发布时间】: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