如何为集成测试创建模拟VaadinSession?

问题描述

我的问题:

这是我第一次为Vaadin UI进行测试,而且我对单元测试也相当陌生。我的问题是我无法对UI组件视图执行任何操作,因为没有VaadinSession可以处理UI Bean。使用@SpringBoottest时不会创建VaadinSession。由于Spring处理了这些bean,所以我能够为后端创建测试,但是似乎无法找到让Vaadin启动会话的方法,这样我就可以访问该会话并进行不同的集成和单元测试。 / p>

我尝试过的事情

TestBench: Vaadin测试台似乎是一个很好的选择,但我面临的问题是,每次打开要访问该网站的ChromeDriver()时,似乎都没有打开VaadinSession在我的本地主机上。

Karibu Library: 这个库似乎是一个很好的选择,但是有一个问题,那就是它打开了实例化的单个UI组件,但是我的几个UI组件类,使用依赖项注入来注入后端服务。由于依赖注入,我无法实例化这些类。

我需要通过VaadinSession访问的UI组件。

@Component
@UIScope
@CssImport("./styles/current-info-styles.css")
public class CurrentDayView extends VerticalLayout implements Updatable {
    private static final long serialVersionUID = 1L;

    //Some code here

    @Autowired
    public CurrentDayView(NowcastWeatherService NowcastWeatherService,GeoLocationService geoLocationService) {
        this.NowcastWeatherService = NowcastWeatherService;
        this.geoLocationService = geoLocationService;

        //Some Code here
    }
   //Some code here

我的测试平台方法

@RunWith(springrunner.class)
@SpringBoottest
public class CurrentDayViewTest extends TestBenchTestCase {

    @Test
    public void faketest() {
        Assert.assertTrue(true);
    }

    @Before
    public void startUp() {
        System.setProperty("webdriver.chrome.driver","src/main/resources/drivers/chromedriver.exe");
        setDriver(new ChromeDriver());
        getDriver().get("http://localhost:8080/");

        populateViewWithinformation();
    }

    @After
    public void tearDown() {
        getDriver().quit();
    }

    private void populateViewWithinformation() {
        CurrentDayView currentDayView = (CurrentDayView) VaadinSession.getCurrent().getAttribute("current-day-view");
        //This is where I get an error because VaadinSession.getCurrent() is null
    }

我的最终问题:

有人对我如何创建VaadinSession或至少获取弹簧来跟踪Vaadin UI组件有任何想法吗?如果不清楚,请随时提出与我的问题有关的更多说明。

解决方法

我建议您再给Karibu再试一次,这对进行不需要运行应用程序的测试非常有用。

看看Karibu V14 Spring demo project。请注意所使用的Karibu依赖项。 ApplicationTest#listOrders测试包含导航到具有自动关联依赖关系的视图。

TestBench测试的问题是TestBench用于测试正在运行的应用程序,并且测试在与实际应用程序完全不同的过程中运行。

因此,当您使用驱动程序打开页面时,会在应用程序中创建一个Vaadin会话,但是您将无法在测试中访问它,也将无法访问任何UI状态或视图。但是,它允许您执行的操作是与应用程序进行交互,就像通过浏览器进行操作一样(单击按钮,填写文本字段等),并在不了解任何有关信息的情况下检查浏览器的状态是否正确。服务器的内部状态。

,

通常来说,当您使用TestBench(基于Selenium)编写集成测试时,您正在做的是引导浏览器。是的,您正在编写Java代码,该代码甚至可能与Vaadin UI代码在同一项目中,但是可以针对任何URL执行该代码,并且您正在与之交互的是浏览器的DOM。您正在描述最终用户将要执行的操作:单击按钮,在输入字段中写一些文本,从单选按钮组中选择一个选项。服务器端是一个黑匣子。毕竟,如果我在StackOverflow上提交了一篇文章,则无法检查它是否存储在数据库中-我所能做的就是看一下我按下“发布答案”按钮后看到的内容。如果您真的想要nitpick,只要该应用程序在浏览器中的行为与之类似,它甚至不需要是您正在使用TestBench测试的Vaadin应用程序。

第二,您不应在VaadinSession中存储任何组件。如果在多个浏览器选项卡中打开Vaadin应用程序,则每个选项卡将共享相同的VaadinSession。单个Component实例只能在一个浏览器选项卡中使用,该组件的根组件是当前用户界面。