【发布时间】:2021-05-31 06:22:44
【问题描述】:
我有一个 Java 的 spring 项目。
在项目中,我有一个 Kafka 配置类和一个使用 Kafka 模板并执行一些逻辑的附加类。
我正在尝试创建一个单元测试来验证我的逻辑,但我无法 @Autowire 测试类中的类。
这是我的课程:
卡夫卡配置
@Configuration
@Getter
@PropertySource(value = "classpath:realtime.properties")
public class KafkaProducerConfig {
@Value("${kafka.producer.client.id}")
private String producerClientId;
@Value("${kafka.url}")
private String kafkaUrl;
@Value("${kafka.retries.config}")
private int retryConfig;
@Bean
public ProducerFactory<Void, SomeClass1> producerFactory1() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaUrl);
configProps.put(ProducerConfig.CLIENT_ID_CONFIG, producerClientId.concat("_someClass1"));
configProps.put(ProducerConfig.RETRIES_CONFIG, retryConfig);
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, VoidSerializer.class.getName());
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroSerde.serializerFor(SomeClass1.class));
return new DefaultKafkaProducerFactory<>(configProps);
}
@Bean
public KafkaTemplate<Void, SomeClass1> kafkaTemplate1() {
return new KafkaTemplate<>(producerFactory1());
}
@Bean
public ProducerFactory<Void, someClass2> producerFactory2() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaUrl);
configProps.put(ProducerConfig.CLIENT_ID_CONFIG, producerClientId.concat("_someClass2"));
configProps.put(ProducerConfig.RETRIES_CONFIG, retryConfig);
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, VoidSerializer.class.getName());
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AvroSerde.serializerFor(someClass2.class));
return new DefaultKafkaProducerFactory<>(configProps);
}
@Bean
public KafkaTemplate<Void, someClass2> kafkaTemplate2() {
return new KafkaTemplate<>(producerFactory2());
}
}
使用Kafka配置的类:
@Component
public class FilterPublisher {
private final String SERVICE_NAME = "some-service";
@Value("${kafka.notification.topic}")
private String notificationTopic;
@Value("${kafka.tracing.topic}")
private String tracingTopic;
@Autowired
private KafkaTemplate<Void, someClass1> kafkaTemplate1;
@Autowired
private KafkaTemplate<Void, someClass2> kafkaTemplate2;
public FilterPublisher() {
}
public void doSomeLogic() {
// do something ...
}
private void publishToKafka() {
// do something ....
}
}
单元测试类:
@TestPropertySource(locations = "classpath:application-test.properties")
@SpringBootTest(classes = {FilterPublisher.class, KafkaProducerConfig.class})
public class FilterPublisherTest {
@Autowired
private FilterPublisher filterPublisher;
@Test
public void tmpTest() {
filterPublisher.processConfigurations();
}
}
运行测试时,filterPublisher 始终为空。
我错过了什么?我究竟做错了什么?我该如何解决?
我也尝试在测试类@Import(TestConfig.class)上使用import注解
@TestConfiguration
public class TestConfig {
@Bean
public FilterPublisher filterPublisher() {
return new FilterPublisher();
}
}
但结果是一样的。
任何帮助将不胜感激,谢谢。
【问题讨论】:
-
您不应该自动装配您要测试的类。你实例化它,模拟任何成员,然后测试它
-
您正在导入可能不会扫描该组件的 KafkaProducerConfig(将正确的组件扫描添加到该类将解决您的问题)。顺便说一句,我建议你遵循@Stultuske 的建议
-
如果我只是实例化该类,kafkaTemplates 将如何启动?组件扫描应该包括项目的路径?
-
我已将
@ComponentScan({"com.path.to.kafka", "com.path.to.publisher"})添加到测试类中,但没有帮助 -
@Dan 确实,而且它与 Spring 无关,所以无论您是否经常使用 Spring,都应该不是问题
标签: java spring unit-testing