Vaadin 10+, как вызвать UI.getCurrent (). Доступ в карибутестинге - PullRequest
2 голосов
/ 18 июня 2019

Я хочу проверить компонент потока Ваадина с помощью карибу-тестирования. В этом компоненте я использую 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 Ответ

2 голосов
/ 18 июня 2019

Надеюсь, я не понял вашего вопроса. Я попытался создать минимальный пример с компонентом, использующим UI.getCurrent().access {} для изменения чего-либо в пользовательском интерфейсе.

Здесь у меня есть компонент с единственным 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();
    }
}

А потом я создал тест Карибу (v. 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());
}

Я нашел эти runUIQueue в документации (https://github.com/mvysny/karibu-testing/tree/master/karibu-testing-v10), где сказано:

Дело в том, что Karibu Testing запускает тест с удерживаемой блокировкой пользовательского интерфейса. Это значительно упрощает тестирование, но также предотвращает асинхронность обновления другим потоком, просто потому что тест держит блокировка!

Решение состоит в том, чтобы на короткое время освободить блокировку пользовательского интерфейса при тестировании. поток, позволяющий задачам UI.access () размещаться из фонового потока в быть обработанным. Затем поток тестирования повторно получит блокировку и продолжить тестирование.

...