首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring单元测试ApplicationReadyEvent业务逻辑

Spring单元测试ApplicationReadyEvent业务逻辑
EN

Stack Overflow用户
提问于 2016-06-27 10:36:28
回答 2查看 5.7K关注 0票数 3

我有一个简单的服务,在该服务中,我使用默认用户预填充了一个user db表。该服务如下所示:

代码语言:javascript
复制
@Service
public class BootstrapService
{
    @Autowired
    UserRepository userRepository;

    public void bootstrap()
    {
        User user = new User("admin", "password");
        userRepository.save(user);
    }
}

我在应用程序启动时使用ApplicationListener调用此服务

代码语言:javascript
复制
@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent>
{
    @Autowired
    private BootstrapService bootstrapService;

    @Override
    public void onApplicationEvent(final ApplicationReadyEvent event)
    {
        bootstrapService.bootstrap();
    }
}

现在,我想为BootstrapService编写一个单元测试,检查用户是否真的被添加了,如下所示:

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
@Transactional
public class BootstrapServiceTests
{
    @Autowired
    private UserRepository userRepository;

    @Autowired
    private BootstrapService bootstrapService;

    @Test
    public void testBootstrap()
    {
        bootstrapService.bootstrap();

        assertEquals(1, userRepository.count());
    }
}

但是,bootstrapService.bootstrap()函数会被调用两次--一次由ApplicationListener调用,一次由测试本身调用,结果将两个用户添加到DB中。

如何防止在运行测试时触发ApplicationListener#ApplicationReadyEvent

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-27 12:50:55

正如注释中提到的,您可以尝试模拟侦听器(但我不确定它在这种情况下是否有效)。我可以想到的其他方法(这是肯定的)是使用Spring,将ApplicationStartup排除在测试概要中运行,如下所示:

代码语言:javascript
复制
@Component
@Profile("!test")
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent>

然后,当您运行测试时,只需使用环境开关:--spring.profiles.active=test

缺点是ApplicationStartup将被排除在使用“测试”配置文件的每个测试运行中。

票数 5
EN

Stack Overflow用户

发布于 2020-07-05 09:30:01

如果您使用@EventListener

代码语言:javascript
复制
@EventListener(
    value = ApplicationReadyEvent.class,
    condition = "@environment.getActiveProfiles()[0] != 'test'")
public void onStartup() throws IOException {}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38051763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档