【问题标题】:spring-boot unit testing get application propertiesspring-boot 单元测试获取应用程序属性
【发布时间】:2019-01-24 07:55:45
【问题描述】:

我是 spring-boot 新手,目前正在尝试开发一个 kafka 生产者 我想测试使用属性文件中定义的值的方法。但它显示值为 null 如何解决这个问题。我已将我的属性文件添加到测试文件夹中的单独资源文件中 this is my folder structure

@SpringBootTest
public class KafkaProducerImplTest {
    @BeforeEach
    void setUp() {
    }

    @Test
    void check() {
        KafkaProducerImpl kpi = new KafkaProducerImpl();
        kpi.check();
    }
    }

    
    @Service
    public class KafkaProducerImpl implements KafkaProducerInterface
    {
    @Value("${kafka.brokers.local}")
    private String kafkaBrokers;
    @Value("${schema-registry}")
    private String schemaRegistry;

    private Properties config()
    {
        Properties props = new Properties();
        props.setProperty("bootstrap.servers",kafkaBrokers);
        props.setProperty("acks", "1");
        props.setProperty("reties", "10");
        props.setProperty("key.serializer", StringSerializer.class.getName());                
        props.setProperty("value.serializer",Serializer.class.getName());
        props.setProperty("schema.registry.url",schemaRegistry);
        return props;
    }

    public <K,T>KafkaProducer<K,T> getProducer()
    {
        return new KafkaProducer<>(config());
    }

    public <T>ProducerRecord createRecord(String Topic,T msg)
    {
        return new ProducerRecord<>(
                Topic,msg
        );
    }


    public void sendMessage(KafkaProducer producer,ProducerRecord record)
    {
        producer.send(record, (recordMetadata, e) -> {
            if (e == null){
                System.out.println("success");
            }
        });

        producer.flush();
    }
    public void closeProducer(KafkaProducer producer){
        producer.close();
    }
    public void check(){
        System.out.println(schemaRegistry);
    }
}

【问题讨论】:

  • 您正在自己创建一个新实例,而不是让 Spring 管理的 KafkaProducerImpl 实例。
  • 好的,我怎样才能使用 spring 托管实例。因为当我尝试通过 @Autowired 获取实例时,它给出了错误
  • 您应该自动连接 KafkaProducerInterface 而不是 Impl 并且您的测试需要 @RunWith(SpringRunner.class)

标签: spring-boot testing junit properties


【解决方案1】:

终于找到方法了,谢谢大家帮助我。

@RunWith(SpringRunner.class)
@SpringBootTest
public class KafkaProducerImplTest {
@Autowired
private KafkaProducerInterface kpi;

@Test
public void check() {
 kpi.check();       
}

}

【讨论】:

  • 与我发布的答案没有什么不同。 :)
【解决方案2】:

使用@RunWith(SpringRunner.class) 注释您的测试类,它将为您加载应用程序上下文并实例化spring bean。要添加 Spring Boot 支持,请添加 @SpringBootTest(您已经拥有)。

您必须删除此行

"KafkaProducerImpl kpi = new KafkaProducerImpl();" 

并使用接口引用自动装配。像这样的:

@Autowired
KafkaProducerInterface kpi;

我假设您在测试属性文件中定义了此处使用的属性(例如“kafka.brokers.local”)。

【讨论】:

  • 我已经按照你说的那样更改了我的代码,java.lang.NullPointerException
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 2016-10-12
  • 2019-04-24
  • 2019-05-18
  • 1970-01-01
  • 2014-01-07
相关资源
最近更新 更多