繁体   English   中英

Spring Boot / JUnit-没有可用的'boolean'类型的合格bean

[英]Spring Boot/JUnit - No qualifying bean of type 'boolean' available

我已经使用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()设置ServiceConfigurer类中的serviceName字段,但这没有帮助。 我怀疑它不起作用,因为涉及DI时出现了问题,并且反射实用程序的使用为时已晚。 只是一个猜测。

我究竟做错了什么?

如果要接受“创建boolean类型的bean”的想法,如何定义一个仅包含布尔值的bean,该boolean值是基于另一条已配置信息的值设置的? 有其他选择吗?

@SpringBootTest(classes = { MessagingManager.class })

Spring尝试将MessagingManager类型的bean添加到您的上下文中。 它通过调用唯一可用的构造函数来实现。 Spring现在想注入类型为ServiceConfigboolean bean作为构造函数参数。 但这失败了,因为在测试上下文中没有boolean类型的bean。

一种解决方案是将该行更改为

@SpringBootTest(classes = { ServiceConfigurer.class })

因为ServiceConfigurer知道如何构造MessagingManager类型的bean。

要将属性注入测试中,您可以添加

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

参加您的测试班。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM