我如何模仿' 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)
感谢您的帮助!
答案 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());
}
});