Надеюсь, я не понял вашего вопроса. Я попытался создать минимальный пример с компонентом, использующим 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 () размещаться из фонового потока в
быть обработанным. Затем поток тестирования повторно получит блокировку и
продолжить тестирование.