2015-12-14 19 views
1

vaadin-spring引入了幾個Spring範圍的對象,即vaadin-sessionvaadin-ui範圍。有必要在你的Spring上下文引用任何Vaadin對象,如果之前綁定這兩個範圍:Vaadin Spring範圍對象:是否可以在不啓動servlet容器的情況下創建Vaadin單元測試?

  • 它們與@VaadinSessionScope@UIScope註釋的裝飾,或
  • 他們通過一些依賴鏈引用的bean是這樣裝飾。

當你在像jboss或tomcat這樣的servlet容器中啓動它時,所有的運行都非常好。現在的問題是:

如果你想加載一個包含Spring應用程序上下文任何vaadin豆所以裝飾的單元測試的目的,你怎麼可以創建一個最小的測試,允許情況下被加載和訪問無啓動一個Web應用程序容器?

回答

1

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

} 
相關問題