我想通过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
}
}
}
答案 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()任务从后台线程发布到 被处理。然后测试线程将重新获得锁并 继续测试。