spring-boot 单元测试获取应用程序属性

Posted

技术标签:

【中文标题】spring-boot 单元测试获取应用程序属性【英文标题】:spring-boot unit testing get application properties 【发布时间】: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) 【参考方案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

以上是关于spring-boot 单元测试获取应用程序属性的主要内容,如果未能解决你的问题,请参考以下文章

基于spring-boot的应用程序的单元测试方案

spring-boot2.0 单元测试JUnit4

Spring-Boot 单元测试:ConstraintValidator 中的@Value

spring-boot 速成(11) - 单元测试

rest-assured : Restful API 测试利器 - 真正的黑盒单元测试(跟Spring-Boot更配哦)

spring-boot-单元测试