我刚开始使用Vaadin,而“我能在Vaadin中进行TDD吗?”是我的首要关注点。到目前为止,我发现这实际上相当容易;尽管我最终写了很多代码。
我必须做的第一件事是编写一些工厂类。这样我就可以将模拟UI对象注入到我的类中。例如:
public class ButtonFactory {
public Button create() {
return new Button();
}
public Button create(String caption) {
return new Button(caption);
}
public Button create(String caption, Button.ClickListener listener) {
return new Button(caption, listener);
}
}
我随后创建了所需的主要UI组件的工厂:
@ApplicationScoped
public class SiteAdminButtonBarFactory implements Serializable {
private static final long serialVersionUID = -462493589568567794L;
private ButtonFactory buttonFactory = null;
private HorizontalLayoutFactory horizontalLayoutFactory = null;
public SiteAdminButtonBarFactory() {}
@Inject
public SiteAdminButtonBarFactory(HorizontalLayoutFactory horizontalLayoutFactory, ButtonFactory buttonFactory) {
this.horizontalLayoutFactory = horizontalLayoutFactory;
this.buttonFactory = buttonFactory;
}
public SiteAdminButtonBar create() {
HorizontalLayout layout = horizontalLayoutFactory.create();
layout.addComponent(addButton());
layout.addComponent(removeButton());
layout.addComponent(editButton());
return new SiteAdminButtonBar(layout);
}
private Button addButton() {
return buttonFactory.create("Add");
}
private Button removeButton() {
return buttonFactory.create("Remove");
}
private Button editButton() {
return buttonFactory.create("Edit");
}
}
相关的测试代码如下:
public class SiteAdminButtonBarFactoryTest {
private HorizontalLayout horizontalLayout = null;
private HorizontalLayoutFactory horizontalLayoutFactory = null;
private Button addButton = null;
private Button removeButton = null;
private Button editButton = null;
private ButtonFactory buttonFactory = null;
private SiteAdminButtonBarFactory siteAdminButtonBarFactory = null;
@Test
public void shouldCreateAHorizontalLayout() throws Exception {
givenWeHaveAFullyConfiguredSiteAdminButtonBarFactory();
SiteAdminButtonBar siteAdminButtonBar = siteAdminButtonBarFactory.create();
assertThat(siteAdminButtonBar, is(notNullValue()));
verify(horizontalLayoutFactory).create();
}
@Test
public void shouldContainAnADDButton() throws Exception {
givenWeHaveAFullyConfiguredSiteAdminButtonBarFactory();
siteAdminButtonBarFactory.create();
verify(buttonFactory).create("Remove");
verify(horizontalLayout).addComponent(removeButton);
}
@Test
public void shouldContainARemoveButton() throws Exception {
givenWeHaveAFullyConfiguredSiteAdminButtonBarFactory();
siteAdminButtonBarFactory.create();
verify(buttonFactory).create("Edit");
verify(horizontalLayout).addComponent(editButton);
}
@Test
public void shouldContainAnEditButton() throws Exception {
givenWeHaveAFullyConfiguredSiteAdminButtonBarFactory();
siteAdminButtonBarFactory.create();
verify(buttonFactory).create("Add");
verify(horizontalLayout).addComponent(addButton);
}
private void givenWeHaveAFullyConfiguredSiteAdminButtonBarFactory() {
horizontalLayout = mock(HorizontalLayout.class);
horizontalLayoutFactory = mock(HorizontalLayoutFactory.class);
when(horizontalLayoutFactory.create()).thenReturn(horizontalLayout);
addButton = mock(Button.class);
removeButton = mock(Button.class);
editButton = mock(Button.class);
buttonFactory = mock(ButtonFactory.class);
when(buttonFactory.create("Add")).thenReturn(addButton);
when(buttonFactory.create("Remove")).thenReturn(removeButton);
when(buttonFactory.create("Edit")).thenReturn(editButton);
siteAdminButtonBarFactory = new SiteAdminButtonBarFactory(horizontalLayoutFactory, buttonFactory);
}
}
我必须承认,起初我必须先编写代码,然后再编写测试,直到我找到了如何构建结构的方法。此外,我还没有实现TDD事件监听器等功能(您会注意到按钮有标题但没有操作监听器)。但是我正在不断进步!