Java 反射不适用于Spring自动连线参数

Java 反射不适用于Spring自动连线参数,java,spring,testing,integration-testing,dao,Java,Spring,Testing,Integration Testing,Dao,为了更好地理解这些概念,我试图在不使用@DataJpaTest的情况下生成一个集成测试。 我注意到,通过反射,我无法在测试的服务层中获取或设置Dao。因此,当使用反射API访问Dao时,它返回一个NullPointerException。我已经测试了Spring框架的Java反射API和ReflectionTestUtils。下面是代码片段 UserService userService; @Before public void setUp(){ userService = new Us

为了更好地理解这些概念,我试图在不使用@DataJpaTest的情况下生成一个集成测试。 我注意到,通过反射,我无法在测试的服务层中获取或设置Dao。因此,当使用反射API访问Dao时,它返回一个NullPointerException。我已经测试了Spring框架的Java反射API和ReflectionTestUtils。下面是代码片段

UserService userService;

@Before
public void setUp(){
   userService = new UserServiceImpl();
   UserDao userDao = (UserDao) ReflectionTestUtils.getField(userService, "userDao");
   userDao.deleteAll(); //HERE RETURNS A NULLPOINTER
   ...
}
假设我在userserviceinpl.java中注入了UserDao(接口),该接口使用Spring框架的@Autowired注释扩展了JpaRepository


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

一个简便的技巧是通过验证您的自动连接依赖项是否真正自动连接来确保您的测试Spring配置正常工作。例如:

@Autowired
UserDao userDao;

@Autowired
UserServiceImpl userService;

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

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

您可以放置完整的堆栈跟踪吗。userDao是否为null,或者它正在其他内部调用中抛出null指针?RestController中的userDao属性为null,因此当我尝试使用反射获取它时,我会得到一个null对象。我不知道w如何从我的集成测试中访问@Autowired UserDao接口。您正在手动创建
UserServiceImpl
。您应该自动连接它并让spring创建对象。然后它将填充所有依赖项。事实上,我忘了插入@RunWith(SpringRunner.class)我还使用了UserServiceImpl的构造函数,而不是让Spring注入它。这是正确的答案,因为它让我找到了解决方案!谢谢!