我使用GWT 2.4和JUnit 4.8.1。在编写扩展GWTTestCase的类时,我想模拟单击页面上的按钮。目前,在我的onModuleLoad方法中,这个按钮只是一个局部字段…
public void onModuleLoad() {
final Button submitButton = Button.wrap(Document.get().getElementById(SUBMIT_BUTTON_ID));
...
// Add a handler to send the name to the server
GetHtmlHandler handler = new GetHtmlHandler();
submitButton.addClickHandler(handler);
我如何模拟点击这个按钮从GWTTestCase?是否必须将此按钮公开为公共成员访问器是否有更优雅的访问方式?以下是我到目前为止在测试用例中的内容:
public class GetHtmlTest extends GWTTestCase {
// Entry point class of the GWT application being tested.
private Productplus_gwt productPlusModule;
@Override
public String getModuleName() {
return "com.myco.clearing.productplus.Productplus_gwt";
}
@Before
public void prepareTests() {
productPlusModule = new Productplus_gwt();
productPlusModule.onModuleLoad();
} // setUp
@Test
public void testSuccessEvent() {
// TODO: Simulate clicking on button
} // testSuccessEvent
}
谢谢,Dave
可以像buttonElement.click()
(或ButtonElement.as(buttonWidget.getElement()).click()
,或ButtonElement.as(Document.get().getElementById(SUBMIT_BUTTON_ID)).click()
)一样简单
但是请记住,GWTTestCase不会在你自己的HTML主机页面中运行,而是在一个空的页面中运行,所以在模拟模块的加载之前,你首先必须在页面中插入你的按钮。
gwt-test-utils似乎是满足您需求的完美框架。与其继承GWTTestCase,不如扩展gwt-test-utils GwtTest类,并使用Browser类实现点击测试,如入门指南中所示:
@Test
public void checkClickOnSendMoreThan4chars() {
// Arrange
Browser.fillText(app.nameField, "World");
// Act
Browser.click(app.sendButton);
// Assert
assertTrue(app.dialogBox.isShowing());
assertEquals("", app.errorLabel.getText());
assertEquals("Hello, World!", app.serverResponseLabel.getHTML());
assertEquals("Remote Procedure Call", app.dialogBox.getText());
}
如果你想保持你的按钮私有,你可以通过自省来检索它。但我的建议是让视图的小部件包受到保护,并在同一个包中编写单元测试,以便它可以访问它们。它更方便和重构友好。
gwt-test-utils提供了自省的便利。例如,要检索可能是私有的"dialogBox"字段,您可以这样做:
DialogBox dialogBox = GwtReflectionUtils.getPrivateFieldValue(app, "dialogBox");
但请注意,使用GwtReflectionUtils不是强制性的。GWT -test-utils允许您在GWT客户端测试中使用任何java类,没有任何限制:)
你可以这样做:
YourComposite view = new YourComposite();
RootPanel.get().add(view);
view.getSubmitButton.getElement().<ButtonElement>cast().click();