【问题标题】:Exclude ApplicationStartup Event listener when testing测试时排除 ApplicationStartup 事件监听器
【发布时间】:2018-03-17 18:04:28
【问题描述】:

我最近在我的 SpringBoot 项目中添加了一个 ApplicationStartup 类

@Component
public class ApplicationStartup
    implements ApplicationListener<ApplicationReadyEvent> { ...

它实现了ApplicationListener。

现在,当我运行与该类无关的旧 JUNit 测试时,测试运行程序会尝试运行我的 StartupListener,这在这些情况下既不必要也不合适。

我的测试初始化​​时如何跳过 ApplicationListener?

@RunWith(SpringRunner.class)
@SpringBootTest
public class SubmissionItemManagerTest {...

【问题讨论】:

  • 你想避免只吃一颗豆子吗?

标签: java spring-boot junit spring-boot-test springrunner


【解决方案1】:

您可以创建一个单独的应用程序类进行测试并排除测试不需要的组件:

@SpringBootApplication
@ComponentScan(excludeFilters = @ComponentScan.Filter(
        type = FilterType.ASSIGNABLE_TYPE, 
        value = { ApplicationStartup.class, 
                 RealApplication.class }))

public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

然后在您的SubmissionItemManagerTest 类中使用TestApplication 类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class SubmissionItemManagerTest {
    ...
}

【讨论】:

    【解决方案2】:

    你可以模拟你的 ApplicationStartup

    将此声明添加到您的测试用例中:

    @MockBean
    private ApplicationStartup applicationStartup
    

    这将创建ApplicationStartup 的模拟实例,并在您的测试上下文中将其标记为@Primary,从而替换ApplicationStartup 的实际实例。

    【讨论】:

    • 使用时怎么做:@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2011-12-30
    相关资源
    最近更新 更多