[英]Testing Presenters in MVP GWT application
我有一个简单的应用程序,并希望使其可测试。 我是这个领域的新手。 这是一个简单的演示者,考虑到这段代码,你能给我建议或给我一些如何测试它的例子。
public class SomePresenter extends Presenter<MainPanelPresenter.Display>
{
public interface Display extends WidgetDisplay
{
HasClickHandlers getAddButton();
HasClickHandlers getDeleteButton();
void setData(ArrayList<Person> data);
ArrayList<String> getSelectedRows();
Widget asWidget();
}
private final DispatchAsync dispatcher;
public static final Place PLACE = new Place("main");
@Inject
public SomePresenter(DispatchAsync dispatcher, EventBus eventBus, Display display)
{
super(display, eventBus);
this.dispatcher = dispatcher;
bind();
}
protected void onBind()
{
display.getAddButton().addClickHandler(new ClickHandler()
{
public void onClick(ClickEvent event)
{
eventBus.fireEvent(new AddButtonEvent());
}
});
display.getDeleteButton().addClickHandler(new ClickHandler()
{
public void onClick(ClickEvent event)
{
ArrayList<String> list = display.getSelectedRows();
deletePerson(list);
}
});
}
....
private void loadDbData()
{
..........
}
private void deletePerson(ArrayList<String> ids)
{
..........
}
}
编辑:
Presenter 是什么,从数据库加载初始数据,有 2 个按钮添加和删除。 当按下添加时,会加载一个新表单,用户可以输入数据并保存到数据库,删除按钮只是从数据库中删除人员。
谢谢
对这样的 class 进行单元测试的一般思路是,就像任何其他 class 一样:
但是,您的 Presenter 版本存在一些问题:
未显示 loadDbData() 方法,但我认为这意味着 Presenter 还可以访问其他一些执行获取的组件。 这个组件可以在依赖中抽象出来,并且像 rest 一样被嘲笑吗?
然后是bind()的测试。 在此方法中,Presenter 的唯一职责是在 Display 提供的某些按钮上设置回调。 您要测试的是:
一些有助于后期的想法:
您可以减少 Presenter 和 Button 之间的耦合。 如果可能,将显示界面从以下位置更改:
Button getAddButton();
至
addAddButtonClickedHandler(ClickHandler);
这意味着您的演示者不必使用返回实际按钮的显示 object
您可以将回调内容减少为调用单个方法,然后您可以单独测试
protected void bind() {
display.addAddButtonClickHandler(new ClickHandler() {
public void onClick(ClickEvent) {
fireAdded();
}
});
}
// The fireAdded function can be tested independenty of the Display, potentially with
// a mock EventBus
protected void fireAdded() {
event.fireEvent(....)
}
如果您真的想检查回调是否设置正确,则可以使用 Display class 的“虚拟”实现,它为您提供所有回调的列表,并让您调用它们
private class DummyDisplay implements Display {
private List<ClickHandler> addButtonClickHandlers;
public void addAddButtonClickHandler(ClickHandler handler) {
addButtonClickHandlers.add(handler);
}
public void fireAddButtonClick() {
for (ClickHandler h in addButtonClickHandlers) {
h.onClick(new ClickEvent());
}
}
// ....
}
然后您的测试将:
这种类型的 class(主要将其他类粘合在一起)往往很难测试; 在某些时候,如果其他课程经过彻底测试,那么专注于胶水而不是胶水可能会适得其反。
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.