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



vaadin-spring引入了两个spring范围的对象,即vaadin-sessionvaadin-ui范围。在引用spring上下文中的任何Vaadin对象之前,有必要绑定这两个作用域,如果:

  • 它们用@VaadinSessionScope@UIScope注释进行装饰,或者
  • 它们通过一些依赖链引用任何以这种方式修饰的bean

当您在jboss或tomcat这样的servlet容器中启动它时,所有操作都运行得非常好。问题是:

如果您想加载一个spring应用程序上下文,其中包含任何为单元测试目的而装饰的vaadin-beans,那么如何创建一个最小的测试,允许在不启动web应用程序容器的情况下加载和访问上下文

Spring MVC在这方面做得很好,但当您使用vaadin-Spring时,它就不那么简单了——相关的vaadin组件是高度连接的。

(以下关于如何构建一组Vaadin组件以允许通过上述范围进行访问的示例不包括完整容器的配置,只是获得正常运行的应用程序上下文所需的最低配置。)

@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");
        }
    }
}

相关内容

最新更新