为了账号安全,请及时绑定邮箱和手机立即绑定

ReflectionTestUtils 设置带有弹簧值注释返回 NPE 的字段

ReflectionTestUtils 设置带有弹簧值注释返回 NPE 的字段

胡说叔叔 2021-10-13 15:42:55
我有一个实现接口的类。该类有一个私有的 double 字段field1,它使用@Valuespring 注释从应用程序属性中读取值。我正在开发测试,我需要从该类中填充该字段。为了实现这一点,我正在使用:        ReflectionTestUtils.setField(Class.class, "field1", value, double.class);我总是收到空指针异常,但调试日志显示:DEBUG org.springframework.test.util.ReflectionTestUtils - Setting field 'field1' of type [double] on target object [null] or target class [class com.a.b.c.Class] to value [value].有人知道如何使用反射为该字段设置值,或者如何为该类字段填充一些值?我没有该类的任何实例,但有接口。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

第一个参数是实例,而不是类


YourClass object = new YourClass();

ReflectionTestUtils.setField(object, "field1", value);


查看完整回答
反对 回复 2021-10-13
?
郎朗坤

TA贡献1921条经验 获得超9个赞

这是我对 ReflectionTestUtils 的一些示例测试。


@ExtendWith(MockitoExtension.class)

class RedisConfigTest {



    @Mock

    JedisConnectionFactory jedisConnectionFactory;


    @Mock

    RedisTemplate redisTemplate;


    @InjectMocks

    @Spy

    private RedisConfig config = new RedisConfig(jedisConnectionFactory, redisTemplate);




    @BeforeEach

    void setUp() {

        ReflectionTestUtils.setField(config, "master", "mymaster");

        ReflectionTestUtils.setField(config, "redisSentinels", "localhost:6379");

        lenient().when(config.jedisConnectionFactory()).thenReturn(jedisConnectionFactory);

        lenient().when(config.redisTemplate()).thenReturn(redisTemplate);


    }


    @Test

    void jedisConnectionFactory(){

        Assertions.assertEquals(config.jedisConnectionFactory(), jedisConnectionFactory);


    }


查看完整回答
反对 回复 2021-10-13
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

它应该是您传递给 setField 的对象的实例。例如,假设 Mockito 它应该去:


@InjectMocks

AbcdImpl abcdImpl;

进而:


ReflectionTestUtils.setField(abcdImpl, "field", "value");


查看完整回答
反对 回复 2021-10-13
  • 3 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信