我使用ReflectionTestUtils在我的服务类中设置int字段来测试类。我的服务类如下:
@Service
public class SampleService {
@Value("${app.count}")
private int count;
@Value("${app.countStr}")
private String countStr;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getCountStr() {
return countStr;
}
public void setCountStr(String countStr) {
this.countStr = countStr;
}
@PostConstruct
public int demoMethod() {
return count + Integer.parseInt(countStr);
}
}
字符串
测试类是这样的:
@RunWith(SpringRunner.class)
public class SampleServiceTest {
@Autowired
private SampleService sampleService;
@TestConfiguration
static class SampleServiceTestConfig {
@Bean
public SampleService sampleService() {
return new SampleService();
}
}
@Before
public void init() {
ReflectionTestUtils.setField(sampleService, "count", new Integer(100));
ReflectionTestUtils.setField(sampleService, "countStr", 100);
}
@Test
public void testDemoMethod() {
int a = sampleService.demoMethod();
Assert.assertTrue(a == 200);
}
}
型
当我运行这个测试用例时,它给出了以下错误:
Caused by: java.lang.NumberFormatException: For input string: "${app.count}"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.lang.Integer.valueOf(Integer.java:766)
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:210)
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115)
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:466)
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:439)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:192)
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:117)
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:70)
... 47 more
型
为什么ReflectionTestUtils尝试在字段中设置字符串值?
我把2个领域,一个是一个整数,另一个是一个字符串测试的目的.
你可以找到源代码here。
请查看并建议解决方法。
3条答案
按热度按时间wfveoks01#
在测试时,你必须提供属性源。如果你不添加属性,它会将
@Value
内部的值注入到变量中。在你的例子中,它试图将字符串添加到给出NumberFormatException
的整数中。尝试如下添加:字符串
当您使用
@Autowired
时,在ReflectionTestUtils
之前,它会尝试添加@Value
内部的值。bgibtngc2#
你的问题是,用
@Before
注解的方法是在spring上下文初始化**之后被调用的,并且服务是由Spring注入到你的测试类中的。这意味着这两个字段:
字符串
将以其
@Value
值中定义的值作为值。String countStr
可以用"${app.countStr}"
String
来赋值(即使它没有意义)。但是
int count
不能用"${app.count}"
String
赋值,因为**"${app.count}"
不能转换为int值**。而抛出的异常
Integer.parseInt("${app.count}")
被调用:型
要解决这个问题,请按照Nisheeth Shah的建议使用
@TestPropertySource
,以便在适当的时候提供属性的值。作为一个一般性的建议,限制反射的使用。它只在运行时检查,这通常是更不透明的。
omvjsjqw3#
另外,请确保不要像下面这样在测试类中重新定义变量。
字符串
很多时候由于从目标类复制粘贴变量导致这样的错误。
对于原始问题,下面这个简单直接的解决方案也有效。
型