как условно не создавать бобы при весенней загрузке? - PullRequest
0 голосов
/ 31 октября 2019

В моем приложении есть компонент, который читает данные из другой системы при запуске приложения. Однако во время тестирования я не хочу, чтобы этот компонент создавался

@Component
@Slf4j
public class DeviceStatisticsSyncHandler {
    @EventListener
    public void handle(ApplicationReadyEvent event) {
        syncDeviceStatisticsDataSync();
    }

    @Value("${test.mode:false}")
    public  boolean serviceEnabled;
}

Я могу использовать условие для решения этой проблемы, но другие читатели кода должны понимать, поэтому я не думаю, что это оченьхороший метод:

@EventListener(condition =  "@deviceStatisticsSyncHandler .isServiceEnabled()")
public void handle(ApplicationReadyEvent event) {
    syncDeviceStatisticsDataSync();
}

public  boolean isServiceEnabled() {
    return !serviceEnabled;
}

@Value("${test.mode:false}")
public  boolean serviceEnabled;

Мое приложение не использует профили, есть ли другой способ решить эту проблему.

Версия Spring Boot: 2.1.3

Ответы [ 2 ]

1 голос
/ 31 октября 2019

для меня это не случай, а состояние, связанное с окружающей средой. Я решу эту проблему, используя пружинный профиль.

Шаг 1: Сначала создайте интерфейс

public interface DeviceStatisticsSyncHandler {

    public void handle(ApplicationReadyEvent event);
}

Шаг 2: Создание реализации дляпроизводство

@Component
@Profile("!test")
public class DeviceStatisticsSyncHandlerImpl implements DeviceStatisticsSyncHandler {
            @EventListener
            @Override
            public void handle(ApplicationReadyEvent event) {
                syncDeviceStatisticsDataSync();
            }
        }

шаг 3: создать реализацию теста

@Component
 @Profile("test")
 public class DeviceStatisticsSyncHandlerTestImpl implements DeviceStatisticsSyncHandler {
                @EventListener
                @Override
                public void handle(ApplicationReadyEvent event) {
                    //do Nothing
                }
}

последний шаг

Все, что вам нужноЧтобы сделать, установите / переключите свойство

-Dspring.profiles.active=test 

или

-Dspring.profiles.active=prod
1 голос
/ 31 октября 2019

Один из возможных вариантов - вообще не загружать DeviceStaticsticsSyncHandler, если вы находитесь в тестовом режиме. «Test.mode» здесь не подходит, потому что в рабочем коде есть что-то, что тесно связано с тестами.

Как насчет следующего подхода:

@Component
@ConditionalOnProperty(name ="device.stats.handler.enabled", havingValue = "true", matchIfMissing=true) 
public class DeviceStatisticsSyncHandler {
   // do whatever you need here, but there is no need for "test.mode" enabled related code here
}

Теперь в тестах выможет определить свойство теста "device.stats.handler.enabled = false" для самого теста или даже поместить это определение в src/test/reources/application.properties, чтобы оно было false для всех тестов в модуле.

Anочевидное преимущество состоит в том, что это определение в значительной степени самоочевидно и может быть легко понято другими сопровождающими проекта.

...