java Spring ReflectionTestUtils不设置基本数据类型字段

rvpgvaaj  于 11个月前  发布在  Java
关注(0)|答案(3)|浏览(77)

我使用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
请查看并建议解决方法。

wfveoks0

wfveoks01#

在测试时,你必须提供属性源。如果你不添加属性,它会将@Value内部的值注入到变量中。在你的例子中,它试图将字符串添加到给出NumberFormatException的整数中。尝试如下添加:

@RunWith(SpringRunner.class)
@TestPropertySource(properties = {"app.count=1", "app.countStr=sampleString"})
public class SampleServiceTest{...}

字符串
当您使用@Autowired时,在ReflectionTestUtils之前,它会尝试添加@Value内部的值。

bgibtngc

bgibtngc2#

你的问题是,用@Before注解的方法是在spring上下文初始化**之后被调用的,并且服务是由Spring注入到你的测试类中的。
这意味着这两个字段:

@Value("${app.count}")
private int count;

@Value("${app.countStr}")
private String countStr;

字符串
将以其@Value值中定义的值作为值。
String countStr可以用"${app.countStr}"String来赋值(即使它没有意义)。
但是int count不能用"${app.count}"String赋值,因为**"${app.count}"不能转换为int值**。
而抛出的异常Integer.parseInt("${app.count}")被调用:

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)


要解决这个问题,请按照Nisheeth Shah的建议使用@TestPropertySource,以便在适当的时候提供属性的值。
作为一个一般性的建议,限制反射的使用。它只在运行时检查,这通常是更不透明的。

omvjsjqw

omvjsjqw3#

另外,请确保不要像下面这样在测试类中重新定义变量。

@Value("${app.count}")
private int count;
@Value("${app.countStr}")
private String countStr;

字符串
很多时候由于从目标类复制粘贴变量导致这样的错误。
对于原始问题,下面这个简单直接的解决方案也有效。

@Before
    public void init() {
        ReflectionTestUtils.setField(sampleService, "count", 100);
        ReflectionTestUtils.setField(sampleService, "countStr", "100");
    }

相关问题