java - Vaadin Spring 作用域对象 : is it possible to create a Vaadin unit test without starting up a servlet container?

标签 java spring unit-testing vaadin

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

  • 它们用 @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");
        }
    }

}

关于java - Vaadin Spring 作用域对象 : is it possible to create a Vaadin unit test without starting up a servlet container?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34263345/

相关文章:

java - 使 gwt 网站在没有哈希符号的情况下可抓取?

java - 无法在java中的数据库中保存日历数据

Spring 预计至少有 1 个 bean 有资格作为此依赖项的 Autowiring 候选者

Spring LDAP querybuilder PartialResultException

java - .jar 文件一直给我 "could not find the main class"。程序将会退出

java - 比较两个映射的键并返回 boolean 值

jquery - 如何对ajax调用进行单元测试

c# - Rhino Mock 参数检查...有更好的方法吗?

c# - 单元测试 HttpContext.Current.Cache 或 C# 中的其他服务器端方法?

java - 类型参数 K 不在类型变量 K 的范围内