У меня есть простой сервис, где я предварительно заполняю таблицу db user
с пользователем по умолчанию. Сервис выглядит следующим образом:Spring Boot - Unit Testing ApplicationReadyEvent бизнес-логика
@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
во время запуска теста?
вы можете высмеять слушателя, прежде чем использовать его в тестовой среде. –