【问题标题】:Unable to use @Autowired in a unit test in a spring project无法在 Spring 项目的单元测试中使用 @Autowired
【发布时间】: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


【解决方案1】:

终于搞定了 这是 Test 类的代码:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {FilterPublisher.class, KafkaProducerConfig.class})
public class FilterPublisherTest {

    @Autowired
    ApplicationContext context;

    @Autowired
    FilterPublisher filterPublisher;

     // ALL TEST METHODS GO HERE

}

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 2018-06-15
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2018-02-07
    • 2021-11-17
    相关资源
    最近更新 更多