如何在非 spring 托管类的单元测试类中获取 ApplicationContext

问题描述

我有一个要求,我必须在 POJO 类中使用 Spring bean 来检索 MyDomainClass 对象。由于在不受 Spring 管理的类中自动装配 bean 是不可能的,因此我必须从另一个 util 类中显式获取 ApplicationContext 并从 applicationContext 对象中检索 bean。请找到下面的代码

@Component
public class ApplicationContextUtils implements ApplicationContextAware{
    
    private static ApplicationContext applicationContext;

      @Override
      public void setApplicationContext(ApplicationContext appContext)
          throws BeansException {
        applicationContext = appContext;
      }

      public static ApplicationContext getApplicationContext() {
        return applicationContext;
      }
}

使用 applicationContext 和检索 bean 的代码如下

public class MyNonBeanClass{

    public MyDomainClass retrieveMyDomainObj(){
        ApplicationContext applicationContext=ApplicationContextUtils.getApplicationContext();
        TestBean testBean=(TestBean)applicationContext.getBean("testBean");
        return testBean.retrieve(param1,param2);
    }
    
}

代码按预期工作,我能够成功地从应用程序上下文中获取 bean。但至少可以说,编写测试用例具有挑战性。我什至不确定我们是否能够为我的非 bean 类编写测试用例,但我仍然想尝试。我正在尝试使用 PowerMock 来模拟 ApplicationContextUtils 中 getApplicationContext() 的静态调用。但是我无法获得获取 TestBean 对象所需的 applicationContext 。当在 applicationContext 上调用 getBean() 时会抛出 NullPointerException。请帮忙解决这个问题。

@RunWith(powermockrunner.class)
@PrepareForTest(ApplicationContextUtils.class)
@ContextConfiguration(classes= { BaseTestContext.class})
public class MyNonBeanClasstest implements ApplicationContextAware{
    
    MyNonBeanClass myNonBeanClass;
    
    ApplicationContext applicationContext;
    
    @Test
    public void test_retrieveMyDomainObj(){
        myNonBeanClass=new MyNonBeanClass();
        powermockito.mockStatic(ApplicationContextUtils.class);
        when(ApplicationContextUtils.getApplicationContext()).thenReturn(applicationContext);
        assertNotNull(myNonBeanClass.retrieveMyDomainObj(param1,param2));
    }

    @Override
    public void setApplicationContext(ApplicationContext appContext) throws BeansException {
        // Todo Auto-generated method stub
        this.applicationContext=appContext;
    }
    
    public ApplicationContext getApplicationContext(){
        return this.applicationContext;
    }
    
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)