Spring Boot / JUnit - нет доступных бинов типа 'boolean' - PullRequest
0 голосов
/ 10 июля 2019

Я использую Spring уже несколько месяцев, но все еще не понимаю некоторые тонкости, налагаемые платформой.

Я пытаюсь выполнить модульный тест для класса и выполняюв часто встречающееся сообщение об ошибке и исключение:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in <package>.MessagingManager required a bean of type 'boolean' that could not be found.

Action:

Consider defining a bean of type 'boolean' in your configuration.

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'boolean' available: expected at least 1 bean which qualifies as autowire candidate.

Класс модульного теста (messagingManager - SUT):

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {MessagingManager.class})
public class TestMessagingManager {

  @Autowired
  private MessagingManager messagingManager;
  ...

Класс конфигурации:

@Configuration
@EnableScheduling
@EnableAsync
@ComponentScan({"<package 1>"})
public class ServiceConfigurer {
  ...
  @Value("${service.name}")
  private String         serviceName;
  ...
  @Bean(name = "messagingManager")
  public MessagingManager messagingManager() {
    return new MessagingManager(serviceConfig(), "MISSION_PLANNER".equals(serviceName));
  }
  ...
  @Bean
  public ServiceConfig serviceConfig() {
    return config.getServiceByName(serviceName);
  }
  ...
}

Класс SUT:

public class MessagingManager {
  ...
  public MessagingManager(ServiceConfig serviceCfg, boolean transactional) {
    ...
  }
  ...
}

Я пытался использовать org.springframework.test.util.ReflectionTestUtils.setField() для установки поля serviceName в классе ServiceConfigurer, но это не помогло.Я подозреваю, что это не работает, потому что проблема возникает, когда задействован DI и что использование утилиты отражения «слишком поздно».Просто предположение.

Что я делаю не так?

Если бы меня развлекала идея "создания бина типа boolean", как мне определить бин, который просто содержит логическое значение?значение, которое установлено на основе значения другого настроенного фрагмента информации?Есть ли альтернативы?

1 Ответ

1 голос
/ 10 июля 2019

С

@SpringBootTest(classes = { MessagingManager.class })

Spring пытается добавить bean-компонент типа MessagingManager в ваш контекст.Это делается путем вызова единственного доступного конструктора.Spring теперь хочет добавить бины типа ServiceConfig и boolean в качестве параметров конструктора.Но это терпит неудачу, потому что в тестовом контексте нет компонента типа boolean.

Одним из решений было бы изменить эту строку на

@SpringBootTest(classes = { ServiceConfigurer.class })

, потому что ServiceConfigurer знает, как построитьbean-компонент типа MessagingManager.

Чтобы добавить свойства в ваш тест, вы можете добавить

@TestPropertySource(properties = { "service.name=example" })

к вашему классу тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...