Java Springboot集成测试-不需要的模拟
我正在尝试为SpringBoot应用程序编写集成测试。代码如下所示Java Springboot集成测试-不需要的模拟,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试为SpringBoot应用程序编写集成测试。代码如下所示 @RunWith(SpringRunner.class) @SpringBootTest(classes = {Application.class, MyTestConfig.class}) @ActiveProfile("test") class MyIntegrationTest { @Autowire ServiceInterface serviceA; } 我注意到applicationContext将一些服务be
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class, MyTestConfig.class})
@ActiveProfile("test")
class MyIntegrationTest {
@Autowire
ServiceInterface serviceA;
}
我注意到applicationContext将一些服务bean作为Mockito mocked对象加载,这实际上违背了集成测试的目的,因为它不执行一些代码。有人能告诉我这里可能出了什么问题吗。请注意,有些服务被正确地自动连接,但有些被模拟。我看不出它们行为不同的任何逻辑原因,因为它们是以相同的方式实现的。我使用的是spring boot 2.0.3
已经试过了
已删除MyTestConfig.class,但问题仍然存在。即使我使用@SpringBootTest(classes={Application.class,MyProblematicsServiceImpl.class}),它仍然会在自动连接的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类 查看,如果您将SpringBootTest注释上的webEnvironment设置设置为默认设置,而不是MOCK,那么它将启动一个真正的web环境。从注释中升级,因此答案是肯定的 应用程序将导致组件扫描,这将拾取您拥有的测试配置。您可能必须排除某些测试配置
Spring Boot提供了@TestConfiguration来解决这个问题。您必须检查Application.class和MyTestConfig.class,看看Mockito模拟了哪些bean。如果存在mockito mock,那是因为集成测试不想执行真正的服务。假设mockito mock正在避免运行第三方服务的测试。。。所以对于那个特殊的测试,你可以避免那个,继续。有些集成测试只是想测试你的应用程序,而不涉及其他公司的服务。这是同一个内部服务,我不明白为什么spring boot测试默认会模拟它。如果我想模拟任何bean,我会使用@MockBean。我很难理解为什么有些课程被嘲笑,而不是所有课程。如何让spring引导避免模拟服务MyTestConfig类是什么样子的?SpringBootTest确实支持模拟服务,但它们必须被注释为MockBean,除非Spring中出现了严重错误。我删除了MyTestConfig.class,但问题仍然存在。MyTestConfig类支持存根实现,它只有一个bean。我遇到的问题不是针对同一个豆子。即使我使用@SpringBootTest(classes={Application.class,MyProblematicsServiceImpl.class}),它仍然会在自动连接的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类。我猜应用程序会导致组件扫描,这将获取您拥有的测试配置。您可能需要排除一些测试配置。我注意到,在doc中,但使用NONE不起作用。我不想在web环境中运行,这是一种独立的应用程序测试配置,因为集成和单元测试都可以扫描相同的配置。我将调整为不使用内部类进行testconfiguration,因为它隐藏了手动检查的内容