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/