我想禁用Kafka消费者正在自动启动,并尝试下面的代码
@Component
class Customizer {
Customizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
@Value("${start.containers:true}") boolean start) {
factory.setAutoStartup(start);
}
}
当我禁用测试用例时,它可以正常工作,但是在执行测试用例时,我看到下面的错误。
java.lang.illegalstateexception:未能加载应用程序上下文,原因是:org.springframework.beans.factory.unsatifiedDependencyException:创建名为“kafkanconsumercustomizer”的bean时出错,该bean在文件[kafkanconsumercustomizer.class]中定义:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.nosuchbeandefinitionexception:没有类型为“org.springframework.kafka.config.abstractkafkalistenercontainerfactory”的合格bean可用:至少需要1个符合autowire候选的bean。
我添加了空的默认构造函数以使测试用例通过,但是它总是引用空的默认构造函数,而不是参数化的构造函数。有没有办法只对测试用例使用空的默认构造函数,否则就使用参数化构造函数?
我试过以下方法
解决方案1:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.config.AbstractKafkaListenerContainerFactory;
import org.springframework.stereotype.Component;
@Component
class KafkaConsumerCustomizer {
KafkaConsumerCustomizer() {
}
KafkaConsumerCustomizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
@Value("${consumer.autostart:true}") boolean start) {
factory.setAutoStartup(start);
}
}
对于解决方案#1:执行了默认构造函数,无法启动/停止使用者
解决方案2:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.config.AbstractKafkaListenerContainerFactory;
import org.springframework.stereotype.Component;
@Component
class KafkaConsumerCustomizer {
@Autowired
AbstractKafkaListenerContainerFactory<?, ?, ?> factory;
@Value("${consumer.autostart:true}")
private boolean start;
KafkaConsumerCustomizer() {
factory.setAutoStartup(start);
System.out.println("Setting Autostart: " + start);
}
}
对于解#2:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.nosuchbeandefinitionexception:没有类型为“org.springframework.kafka.config.abstractkafkalistenercontainerfactory”的合格bean可用:至少需要1个符合autowire候选的bean。依赖项注解:{}u2028,位于org.springframework.beans.factory.support.constructorresolver.createargumentarray(constructorresolver)。java:767)
如何在不破坏测试用例的情况下禁用kafka消费者自动启动?
更新:已从kafkaconsumercustomizer类中删除@component标记
class KafkaConsumerCustomizer {
KafkaConsumerCustomizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
@Value("${consumer.autostart:true}") boolean start) {
factory.setAutoStartup(start);
}
}
我还更新了主配置类
@Getter
@RefreshScope
@Import(processorConfig.class)
@Configuration
public class appSpringConfiguration {
@Bean
KafkaConsumerCustomizer kafkaCustomizer() {
return new KafkaConsumerCustomizer();
}
}
它仍然抛出以下错误:
java:[49,12]com.xx类中的构造函数kafkaconsumercustomizer.kafkaconsumercustomizer不能应用于给定类型[error]必需:org.springframework.kafka.config.abstractkafkalistenercontainerfactory,boolean[error]找到:没有参数[error]原因:实际参数列表和形式参数列表的长度不同[error]->[help 1]
1条答案
按热度按时间8ulbf1ek1#
大概你的测试没有被标记
@SpringBootTest
.您可以添加
mock(AbstractKafkaListenerContainerFactory)
bean到您的测试配置,或者不使用@Component
在定制器上;而是添加一个@Bean
在主配置中。然后,在测试中通过组件扫描将找不到它。
在别的地方
@Configuration
类,添加或者。。。