【问题标题】:Reflection not working for Spring autowired parameters反射不适用于 Spring 自动装配参数
【发布时间】:2017-11-20 13:42:04
【问题描述】:

我正在尝试在不使用 @DataJpaTest 的情况下生成集成测试,以便更好地理解这些概念。 我注意到使用反射我无法在我的被测服务层中获取或设置 The Dao。因此,当访问使用反射 API 获得的 Dao 时,它会返回 NullPointerException。我已经测试了 Spring Framework 的 Java Reflection API 和 ReflectionTestUtils。这是代码的sn-p

UserService userService;

@Before
public void setUp(){
   userService = new UserServiceImpl();
   UserDao userDao = (UserDao) ReflectionTestUtils.getField(userService, "userDao");
   userDao.deleteAll(); //HERE RETURNS A NULLPOINTER
   ...
}

考虑到在 UserServiceImpl.java 中我注入了 UserDao(使用 Spring 框架的 @Autowired 注释扩展 JpaRepository 的接口。

如何从我的服务访问 Dao(由 Spring 框架实现)?谢谢!

【问题讨论】:

  • 你能把完整的堆栈跟踪。 userDao 是 null 还是在其他内部调用中抛出 NullPointer?
  • RestController 中的 userDao 属性为空,因此当我尝试使用反射获取它时,我得到一个空对象。我不知道如何从我的集成测试中访问 @Autowired UserDao 接口。
  • 您正在手动创建UserServiceImpl。您应该自动装配它并让 spring 创建对象。然后它将填充所有依赖项。

标签: java spring testing integration-testing dao


【解决方案1】:

一个方便的技巧是通过验证您的自动装配依赖项实际上正在自动装配来确保您的测试 Spring 配置正常工作。例如:

@Autowired
UserDao userDao;

@Autowired
UserServiceImpl userService;

@Test
public void verifySpringContext() {
    assertNotNull(userDao);
    assertNotNull(userService.getUserDao());
} 

我怀疑您的测试中的 Spring 配置存在问题,导致 userDao 无法自动装配。

【讨论】:

  • 事实上我忘了插入 @RunWith(SpringRunner.class) 并且我使用了 UserServiceImpl 的构造函数而不是让 Spring 注入它。这是正确的答案,因为它让我找到了解决方案!谢谢!
猜你喜欢
  • 2014-04-30
  • 2011-03-10
  • 1970-01-01
  • 2018-02-28
  • 2011-09-24
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多