2016-06-27 2 views
0

У меня есть простой сервис, где я предварительно заполняю таблицу 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 во время запуска теста?

+0

вы можете высмеять слушателя, прежде чем использовать его в тестовой среде. –

ответ

1

Как уже упоминалось в комментарии, вы можете попытаться высмеять слушателя (но я не уверен, что он будет работать в этом точном случае). Другой способ, что я могу думать (это работает точно), чтобы использовать пружинные профили, чтобы исключить ApplicationStartup запуск в тестовом профиле, как это:

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

Затем, когда вы запускаете тесты, просто используйте переключатель среды: --spring.profiles.active=test

Недостатком является то, что ApplicationStartup будет исключен из каждого тестового прогона с профилем «тест».