我正在实现一个非常简单的单元测试,它增加了Google番石榴库CacheLoader的计数器,并得到了这个值。
RateLimitTest
@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:
@Configuration
public class RateLimitTestConfiguration {
@Bean
public RateLimitFilter rateLimitFilter() {
return new RateLimitFilter();
}
}这是应用程序的普通类:
@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上:
throttling:
request:
rate:
minute: 5测试失败时出错:
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)发布于 2020-07-27 20:53:50
有很多方法可以让它发挥作用。我会给他们两个:
@SpringBootTest(classes = RateLimitTestConfiguration.class)替换@ContextConfiguration(classes = RateLimitTestConfiguration.class)。仅适用于SpringBoot.PropertySourcesPlaceholderConfigurer bean添加到您的配置中(第一种方法会自动配置此bean,以及其他方法):@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("application.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}https://stackoverflow.com/questions/63122970
复制相似问题