gpt4 book ai didi

Spring Boot - 单元测试 ApplicationReadyEvent 业务逻辑

转载 作者:行者123 更新时间:2023-12-05 01:19:43 25 4
gpt4 key购买 nike

我有一个简单的服务,我用默认用户预填充了一个 user 数据库表。该服务如下所示:

@Service
public class BootstrapService
{
@Autowired
UserRepository userRepository;

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

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

@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent>
{
@Autowired
private BootstrapService bootstrapService;

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

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

@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 调用,一次被测试本身调用,导致添加了两个用户到数据库。

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

最佳答案

如评论中所述,您可以尝试模拟监听器(但我不确定它是否适用于这种精确情况)。我能想到的其他方法(这肯定有效)是使用 Spring 配置文件,以排除 ApplicationStartup 在测试配置文件中运行,如下所示:

@Component
@Profile("!test")
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent>

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

缺点是 ApplicationStartup 将被排除在每次带有“测试”配置文件的测试运行之外。

关于Spring Boot - 单元测试 ApplicationReadyEvent 业务逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38051763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com