gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:42:29 25 4
gpt4 key购买 nike

我已经使用 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”的想法,我如何定义一个仅保存 boolean 值的 bean,该值是根据另一个配置的信息片段的值设置的?有替代方案吗?

最佳答案

@SpringBootTest(classes = { MessagingManager.class })

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

一个解决方案是将这一行更改为

@SpringBootTest(classes = { ServiceConfigurer.class })

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

要将属性注入(inject)到您的测试中,您可以添加

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

到你的测试类。

关于java - Spring Boot/JUnit - 没有 'boolean' 类型的合格 bean 可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56960455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com