Vaadin将课程附加到Page?

时间:2015-03-04 14:27:13

标签: java testing mockito vaadin

我如何模仿' Page'并将课程页面设置为我的模拟? (这甚至可能吗?)

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)

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

如果你想模拟Vaadin进行单元测试,最好创建一个模拟和设置这些类的实用程序类:UI,VaadinService,VaadinSession,VaadinRequest和Navigator。

这是一个模拟Page class的Mockito单元测试:

@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());
    }
});