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



我的问题:

这是我第一次为VaadinUI做测试,而且我对一般的单元测试也相当陌生。我的问题是,我不能对我的UI组件Views做任何事情,因为没有VaadinSession来处理UI bean。使用@SpringBootTest时,永远不会创建VaadinSession。由于Spring处理这些bean,我能够为我的后端创建测试,但我似乎无法找到让Vaadin启动会话的方法,这样我就可以访问会话并进行不同的集成和单元测试。

我尝试了什么

TestBench:Vaadin测试台似乎是一个很好的选择,但我面临的问题是,每当我打开ChromeDriver((并访问本地主机上的网站时,它似乎不会打开VaadinSession。

Karibu库:这个库看起来是一个很好的选择,但有一个问题,那就是它打开了实例化的单个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,或者至少让spring跟踪VaadinUI组件吗?如果这一点不清楚,那么请随时询问与我的问题有关的更多澄清。

我建议你再给Karibu一次机会,它非常适合做这些不需要应用程序运行的测试。

看看Karibu V14 Spring演示项目。注意使用了什么Karibu依赖项。ApplicationTest#listOrders测试包含到具有自动连接依赖关系的视图的导航。

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

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

一般来说,当您使用TestBench(基于Selenium(编写集成测试时,您所做的就是引导浏览器。是的,您正在编写Java代码,该代码甚至可能与您的Vaadin UI代码在同一个项目中,但它可以针对任何URL执行,并且您与之交互的是浏览器的DOM。您正在描述最终用户会做什么:单击一个按钮,在输入字段中写入一些文本,从单选按钮组中选择一个选项。服务器端是一个黑盒。毕竟,如果我在StackOverflow上提交一篇帖子,我就无法检查它是否存储在数据库中——我所能做的就是在按下";张贴你的答案";按钮如果你真的想挑剔,它甚至不需要是你用TestBench测试的Vaadin应用程序,只要该应用程序的行为与浏览器中的一样。

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

最新更新