我有一个简单的服务,在该服务中,我使用默认用户预填充了一个user db表。该服务如下所示:
@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调用,一次由测试本身调用,结果将两个用户添加到DB中。
如何防止在运行测试时触发ApplicationListener#ApplicationReadyEvent?
发布于 2016-06-27 12:50:55
正如注释中提到的,您可以尝试模拟侦听器(但我不确定它在这种情况下是否有效)。我可以想到的其他方法(这是肯定的)是使用Spring,将ApplicationStartup排除在测试概要中运行,如下所示:
@Component
@Profile("!test")
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent>然后,当您运行测试时,只需使用环境开关:--spring.profiles.active=test
缺点是ApplicationStartup将被排除在使用“测试”配置文件的每个测试运行中。
发布于 2020-07-05 09:30:01
如果您使用@EventListener
@EventListener(
value = ApplicationReadyEvent.class,
condition = "@environment.getActiveProfiles()[0] != 'test'")
public void onStartup() throws IOException {}https://stackoverflow.com/questions/38051763
复制相似问题