0

我试图找出其中哪一个更符合 MVP 模式。

假设在我的 ViewDesktopImpl 类中,我有以下代码:

class ViewDesktopImpl implements View {

  ValueListBox<Object> valueListBox
}

现在,这就是我想知道的。执行以下操作是否更有意义:

  1. 在我的 View 界面中有一个 HasConstrainedValue getter,Presenter 调用 getHasConstrainedValue 并填充它

  2. 在我的 View 界面中有一个 setValues(List objects),Presenter 调用 view.setValues 并且 ViewDesktopImpl 处理填充 valueListBox

我相信选择选项 1 会更好我只是想从中获得利弊 - 是的,这可能是一种主观模式,但我想就应该采取哪个选项获得一些其他意见和理由它如何符合 MVP 标准。

4

2 回答 2

1

我猜你想将 ListBox 实现为 MVP。查看SelectOneListBox中的David Chandler. 如果您的问题与特定的小部件无关,我会说拥有一个 getter 和一个 setter 是一个好方法。看HasText界面。

在测试您的演示者时,您将模拟您的视图以使用以下方式设置您的测试数据Mockito

@Mock
MyView view;

List testValues = ...;
when(view.getValues().getValues()).thenReturn(testValues);
result = presenter.method(...);
assertTrue(result == expected);

视图定义为:

public interface MyView extends View {
  HasValueList getValues();
}

public interface HasValueList {
  void setValues(List objects);
  List getValues();
}
于 2012-05-10T17:36:33.810 回答
1

以下是我如何做我的 MVP。

除了让我的演示者在我的视图中调用 getter 之外,我的视图调用了我的演示者的方法。通过这种方式,业务逻辑与演示者隔离,并且无需模拟视图即可轻松测试。

public interface MyView extends View {
  void setObjectsList(List<Object> objects);
  void setPresenter(Presenter presenter);

  interface Presenter {
    void handleObjectSelected(Object object);
  }
}

Presenter 实现 MyView.Presenter:

class MyPresenter implements MyView.Presenter {
  private final MyView myView;
  private List<Object> objects;

  public MyPresenter(MyView myView, List<Objects> objects) {
    this.myView = myView;
    this.objects = objects;  
  }

  public void initialize() {
    myView.setPresenter(this);
    myView.setObjectsList(objects);
  }

  @Override
  public void handleObjectSelected(Object object) {
    // Do something with selected object.
  }
}

示例 MyView 实现:

class MyViewImpl implements MyView {
  private Presenter presenter;
  ...

  @Override
  public void setObjectsList(List<Object> objects) {
    // Do something with object list.
  }

  @Override
  public void setPresenter(Presenter presenter) {
    this.presenter = presenter;
  }

  public void somethingHappened() {
    presenter.handleObjectSelected(object);
  }
}

使用 ListBox 的 MyView 的第二个实现示例:

class ListBoxMyViewImpl implements MyView {
  @UiField ListBox listBox;

  private Presenter presenter;
  private List<Object> objects;

  public MyListBoxView() {
    objects = Lists.newArrayLists();
  }

  @Override
  public void setObjectsList(List<Object> objects) {
    this.objects = objects; 
    listBox.clear();
    for (Object object : objects) {
      listBox.addItem(object.toString());
    }
  }

  @Override
  public void setPresenter(Presenter presenter) {
    this.presenter = presenter;
  }

  @UiHandler("listBox")
  void onChange(ChangeEvent e) {
    presenter.handleObjectSelected(objects.get(listBox.getSelectedIndex());
  }
  ...
}

这样您就不需要模拟您的视图来测试演示者逻辑。

代替:

@Mock
MyView view;

List testValues = ...;
when(view.getValues().getValues()).thenReturn(testValues);
result = presenter.method(...);
assertTrue(result == expected);

您将测试您的演示者逻辑:

List testValues = ...;
assertEquals(expected, presenter.method(testValues));
于 2012-05-11T10:51:37.430 回答