Vaadin 附加 class 到页面?

Vaadin attach class to Page?

如何模拟 'Page' 并将 class 的页面设置为我的模拟? (这可能吗?)

public class Example extends CssLayout(){

    public void notification(){
        Notification notif = new Notification("Title", "Message", Notification.Type.HUMANIZED_MESSAGE);
        notif.setStyleName("Warning");
        notif.setPosition(Position.TOP_CENTER);
        notif.setDelayMsec(10000);
        notif.show(Page.getCurrent());

    }
}

我想做什么:

Example example = new Example();
Page p = mock(Page.class);
example.setPage(p)

感谢您的帮助!

Vaadin UI class 创建并拥有 Page 实例。您可以使用反射设置模拟,但要小心,因为您最终可能会在模拟中实现大量页面 class 功能,具体取决于您的应用程序通常使用页面或框架的程度。

如果您想为单元测试模拟 Vaadin,创建一个模拟和设置这些 classes 的实用程序 class 可能是个好主意:UI 、VaadinService、VaadinSession、VaadinRequest 和 Navigator。

这是模拟页面的 Mockito 单元测试 class:

@RunWith(MockitoJUnitRunner.class)
public class HelloUiTest {
    private HelloUi ui;

    @Mock
    private Page page;

    @Mock
    private VaadinRequest req;

    @Before
    public void setup() throws Exception {
        initUi();
        mockPage();
    }

    private void initUi() {
        ui = new HelloUi();
        ui.init(req);
        CurrentInstance.setInheritable(UI.class, ui);
    }

    private void mockPage() throws NoSuchFieldException, IllegalAccessException {
        Field pageField = UI.class.getDeclaredField("page");
        pageField.setAccessible(true);
        pageField.set(ui, page);
    }

    @Test
    public void testNotification() {
        ui.getButton().click();

        verify(page).getLocation();
    }
}

这次测试的功能是这个点击监听器:

button.addClickListener(new Button.ClickListener() {
    @Override
    public void buttonClick(Button.ClickEvent clickEvent) {
        Notification.show("You are at: " + Page.getCurrent().getLocation());
    }
});