首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SpringBoot单元测试未正确获取@组件自动配置对象的值

SpringBoot单元测试未正确获取@组件自动配置对象的值
EN

Stack Overflow用户
提问于 2020-07-27 20:22:59
回答 1查看 128关注 0票数 2

我正在实现一个非常简单的单元测试,它增加了Google番石榴库CacheLoader的计数器,并得到了这个值。

RateLimitTest

代码语言:javascript
运行
复制
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = RateLimitTestConfiguration.class)
public class RateLimitTest {

    @Autowired
    RateLimitFilter rateLimitFilter;

    @Test
    public void incrementCounter_whenGetCounter_existsKey_and_returnIncrementedValue() throws ExecutionException {
        final int times = 10;
        final String counterName = "TestCounter";
        int i = 0;
        for(i = 0; i < 10; i++)  {
            rateLimitFilter.getRequestCountPerApiKey().put(counterName,i);
        }
        Assert.assertNotNull(rateLimitFilter.getRequestCountPerApiKey().get(counterName));
        Assert.assertEquals(Long.valueOf(times),Long.valueOf(rateLimitFilter.getRequestCountPerApiKey().get(counterName)));
    }

}

因此,我在测试上下文中实现了@Bean:

代码语言:javascript
运行
复制
@Configuration
public class RateLimitTestConfiguration {

    @Bean
    public RateLimitFilter rateLimitFilter() {
        return new RateLimitFilter();
    }

}

这是应用程序的普通类:

代码语言:javascript
运行
复制
@Component
public class RateLimitFilter implements GatewayFilter {

    final Logger LOGGER = LoggerFactory.getLogger(RateLimitFilter.class);

    @Value("${throttling.request.rate.minute}")
    private int MAX_REQUEST_PER_MINUTE;

    private LoadingCache<String,Integer> requestCountPerApiKey;

    ....

public LoadingCache<String, Integer> getRequestCountPerApiKey() {
        return requestCountPerApiKey;
    }
}

在我设置的测试的application.yml上:

代码语言:javascript
运行
复制
throttling:
  request:
    rate:
      minute: 5

测试失败时出错:

代码语言:javascript
运行
复制
 Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "${throttling.request.rate.minute}"
        at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:79)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1252)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1224)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
        ... 55 common frames omitted
    Caused by: java.lang.NumberFormatException: For input string: "${throttling.request.rate.minute}"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.base/java.lang.Integer.parseInt(Integer.java:638)
        at java.base/java.lang.Integer.valueOf(Integer.java:983)
        at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:211)
        at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115)
        at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:429)
        at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:402)
        at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:155)
        at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73)
EN

回答 1

Stack Overflow用户

发布于 2020-07-27 20:53:50

有很多方法可以让它发挥作用。我会给他们两个:

  1. 您可以简单地用@SpringBootTest(classes = RateLimitTestConfiguration.class)替换@ContextConfiguration(classes = RateLimitTestConfiguration.class)。仅适用于SpringBoot.
  2. ,您可以手动将PropertySourcesPlaceholderConfigurer bean添加到您的配置中(第一种方法会自动配置此bean,以及其他方法):

代码语言:javascript
运行
复制
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource("application.yml"));
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
    return propertySourcesPlaceholderConfigurer;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63122970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档