Vaadin 10+,如何在kaributesting中触发UI.getCurrent()。access

时间:2019-06-18 07:24:03

标签: kotlin vaadin vaadin-flow vaadin10

我想通过karibu-testing测试Vaadin流组件。在此组件中,我正在使用UI.getCurrent().access {}更新此组件,但是在运行测试时,access中的代码将不会执行。当我尝试在测试本身中使用UI.getCurrent().access {}时,结果相同...一些想法吗?

pom.xml

<dependency>
   <groupId>com.github.mvysny.kaributesting</groupId>
   <artifactId>karibu-testing-v10</artifactId>
   <version>1.1.4</version>
</dependency>

测试(科特琳)

class MyUITest {

    @BeforeAll
    fun init() {
        MockVaadin.setup()
    }

    @BeforeEach
    fun setup() {
        UI.getCurrent().removeAll()
    }

    @Test
    fun testSometing() {
        UI.getCurrent().access {
            print("foo") // this line is not reachable
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我希望我不要误会你的问题。我试图用一个使用UI.getCurrent().access {}来更改UI中某些内容的组件来创建一个最小示例。

在这里,我有一个带有单个TextField且值为“ hallo”的组件。该组件内部有一个方法,可将TextField的值更改为“嘿”。

该组件看起来像

package com.example.test;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.Tag;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.server.Command;

@Tag(value = "myComponent")
public class MyComponent extends Component {
    private TextField textField = new TextField();

    public MyComponent() {
        textField.setValue("hallo");
    }

    public void changeValueToHey() {
        UI.getCurrent().access((Command) () -> {
            textField.setValue("hey");
        });
    }

    public String getTextFieldValue() {
        return textField.getValue();
    }
}

然后我创建了一个karibu测试(1.1.6版),如下所示:

@Test
public void test() {
    MyComponent myComponent = new MyComponent();
    UI.getCurrent().add(myComponent);
    assertEquals("hallo", myComponent.getTextFieldValue());
    MockVaadin.INSTANCE.runUIQueue(true);
    myComponent.changeValueToHey();
    MockVaadin.INSTANCE.runUIQueue(true);
    assertEquals("hey", myComponent.getTextFieldValue());
}

我在文档(https://github.com/mvysny/karibu-testing/tree/master/karibu-testing-v10)中找到了这些runUIQueue

  

问题是Karibu Testing会在用户界面锁定保持不变的情况下运行测试。   这大大简化了测试,但也防止了异步   只是因为测试持有   锁!

     

解决方案是在测试中短暂释放UI锁定   线程,允许UI.access()任务从后台线程发布到   被处理。然后测试线程将重新获得锁并   继续测试。