Java 无法在spring项目的单元测试中使用@Autowired
我有一个Java的spring项目。 在这个项目中,我有一个Kafka配置类和一个使用Kafka模板并执行一些逻辑的附加类。 我试图创建一个单元测试来验证我的逻辑,但我无法Java 无法在spring项目的单元测试中使用@Autowired,java,spring,unit-testing,Java,Spring,Unit Testing,我有一个Java的spring项目。 在这个项目中,我有一个Kafka配置类和一个使用Kafka模板并执行一些逻辑的附加类。 我试图创建一个单元测试来验证我的逻辑,但我无法@Autowire测试类中的类。 以下是我的课程: 卡夫卡构型 @Configuration @Getter @PropertySource(value = "classpath:realtime.properties") public class KafkaProducerConfig { @Va
@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());
}
}
运行测试时,filterPublisher
始终为空。
我错过了什么?我做错了什么?我怎么修理它
我还尝试在测试类@import(TestConfig.class)
但结果是一样的
任何帮助都将不胜感激,谢谢。终于让它工作了,
以下是测试类的代码:
@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();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {FilterPublisher.class, KafkaProducerConfig.class})
public class FilterPublisherTest {
@Autowired
ApplicationContext context;
@Autowired
FilterPublisher filterPublisher;
// ALL TEST METHODS GO HERE
}
您不应该自动连接要测试的类。实例化它,模拟任何成员,并测试它如果导入KafkaProducerConfig,可能不会扫描该组件(将正确的组件扫描添加到该类将解决您的问题)。顺便说一句,我建议您遵循@Stultuske advice如果我只是实例化这个类,kafkaTemplates将如何启动?组件扫描应该包括项目的路径?我已经向测试类添加了
@ComponentScan({“com.path.to.kafka”,“com.path.to.publisher”})
,但它没有help@Dan事实上,它与Spring无关,所以您是否经常使用Spring不应该成为一个问题
@TestConfiguration
public class TestConfig {
@Bean
public FilterPublisher filterPublisher() {
return new FilterPublisher();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {FilterPublisher.class, KafkaProducerConfig.class})
public class FilterPublisherTest {
@Autowired
ApplicationContext context;
@Autowired
FilterPublisher filterPublisher;
// ALL TEST METHODS GO HERE
}