Java Vaadin-Spring作用域对象:是否可以在不启动servlet容器的情况下创建Vaadin单元测试?

Java Vaadin-Spring作用域对象:是否可以在不启动servlet容器的情况下创建Vaadin单元测试?,java,spring,unit-testing,vaadin,Java,Spring,Unit Testing,Vaadin,介绍了两个Spring作用域对象,即vaadin会话和vaadin用户界面作用域。在spring上下文中引用任何Vaadin对象之前,有必要绑定这两个作用域,如果: 它们用@VaadinSessionScope或@UIScope注释装饰,或 它们通过依赖链引用任何以这种方式修饰的bean 当您在诸如jboss或tomcat之类的servlet容器中启动它时,所有这些都运行得非常好。问题是: 如果您希望加载一个spring应用程序上下文,该上下文包含为单元测试目的而如此修饰的任何vaadin

介绍了两个Spring作用域对象,即
vaadin会话
vaadin用户界面
作用域。在spring上下文中引用任何Vaadin对象之前,有必要绑定这两个作用域,如果:

  • 它们用
    @VaadinSessionScope
    @UIScope
    注释装饰,或
  • 它们通过依赖链引用任何以这种方式修饰的bean
当您在诸如jboss或tomcat之类的servlet容器中启动它时,所有这些都运行得非常好。问题是:


如果您希望加载一个spring应用程序上下文,该上下文包含为单元测试目的而如此修饰的任何vaadin bean,如何创建允许在不启动web应用程序容器的情况下加载和访问上下文的最小测试?

Spring MVC在这方面非常擅长,但当您使用vaadin Spring时,它并不是那么简单-相关的vaadin组件是高度连接的

(下面的示例介绍了如何构造一组Vaadin组件以允许通过上述作用域进行访问,其中不包括完整容器的配置,而只是获得正常运行的应用程序上下文所需的最低配置。)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigWebContextLoader.class)
@WebAppConfiguration
公共类SpringConfigurationTest扩展了断言{
@配置
@ComponentScan({“org.example”})//包含一些ClassReferenceGaspringVaadInBean.class
公共静态类配置{
}
@自动连线
WebApplicationContext应用上下文;
类MyDeploymentConfiguration扩展了DefaultDeploymentConfiguration{
公共MyDeploymentConfiguration(类servletClass,属性initParameters){
super(servletClass,initParameters);
initParameters.put(Constants.SERVLET_PARAMETER_UI_PROVIDER,DefaultUIProvider.class.getName());
}
}
类MyVaadinServlet扩展了VaadinServlet{
@凌驾
公共字符串getServletName(){
返回getClass().getSimpleName();
}
}
类MyUI扩展了UI{
@凌驾
受保护的void init(VaadinRequest请求){
}
}
@以前
public void setupvadinscopes()引发异常{
MyVaadinServlet vaadinServlet=新的MyVaadinServlet();
MyDeploymentConfiguration deploymentConfiguration=新的MyDeploymentConfiguration(MyVaadinServlet.class,
新属性());
VaadinServletService vaadinService=新的VaadinServletService(vaadinServlet,deploymentConfiguration);
VaadinServletRequest vaadinRequest=新的VaadinServletRequest(新的MockHttpServletRequest(),vaadinService);
//创建vaadin会话和vaadin ui,并将它们绑定到线程
VaadinSession VaadinSession=vaadinService.findVaadinSession(vaadinRequest);
Integer uiId=Integer.valueOf(vaadinSession.getNextUIid());
UI=新的MyUI();
ui.设置会话(会话);
UI.setCurrent(UI);
doInit(vaadinRequest,uiId,null);
vaadinSession.addUI(ui);
}
@试验
公共void test0(){
试一试{
getBean(someClassReferenceInGaspringVaadInBean.class);
}捕获(例外e){
失败(“范围可能未正确设置”);
}
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
@WebAppConfiguration
public class SpringConfigurationTest extends Assert {

    @Configuration
    @ComponentScan({ "org.example" }) // contains SomeClassReferencingASpringVaadinBean.class
    public static class Config {
    }

    @Autowired
    WebApplicationContext applicationContext;

    class MyDeploymentConfiguration extends DefaultDeploymentConfiguration {
        public MyDeploymentConfiguration(Class<?> servletClass, Properties initParameters) {
            super(servletClass, initParameters);
            initParameters.put(Constants.SERVLET_PARAMETER_UI_PROVIDER, DefaultUIProvider.class.getName());
        }
    }

    class MyVaadinServlet extends VaadinServlet {
        @Override
        public String getServletName() {
            return getClass().getSimpleName();
        }
    }

    class MyUI extends UI {
        @Override
        protected void init(VaadinRequest request) {
        }
    }

    @Before
    public void setupVaadinScopes() throws Exception {
        MyVaadinServlet vaadinServlet = new MyVaadinServlet();
        MyDeploymentConfiguration deploymentConfiguration = new MyDeploymentConfiguration(MyVaadinServlet.class,
                new Properties());
        VaadinServletService vaadinService = new VaadinServletService(vaadinServlet, deploymentConfiguration);
        VaadinServletRequest vaadinRequest = new VaadinServletRequest(new MockHttpServletRequest(), vaadinService);
        // creates vaadin session and vaadin ui, binds them to thread
        VaadinSession vaadinSession = vaadinService.findVaadinSession(vaadinRequest);
        Integer uiId = Integer.valueOf(vaadinSession.getNextUIid());
        UI ui = new MyUI();
        ui.setSession(vaadinSession);
        UI.setCurrent(ui);
        ui.doInit(vaadinRequest, uiId, null);
        vaadinSession.addUI(ui);
    }

    @Test
    public void test0() {
        try {
             applicationContext.getBean(SomeClassReferencingASpringVaadinBean.class);
        } catch (Exception e) {
            fail("scopes were probably not set up correctly");
        }
    }

}