我试图找出其中哪一个更符合MVP模式。
假设在我的 ViewDesktopImpl 类中,我有以下代码:
class ViewDesktopImpl implements View {
ValueListBox<Object> valueListBox
}
现在,这就是我想知道的。 执行以下操作是否更有意义:
在我的视图界面中有一个 HasConstrainedValue getter,演示者调用 getHasConstrainedValue 并填充它
在我的视图界面中有一个setValues(List对象),演示器调用view.setValues,ViewDesktopImpl句柄填充valueListBox。
我相信最好采取选项 1 我只想了解这一点的利弊 - 是的,这可能是一种主观模式,但我想获得一些其他意见和理由,关于应该采取哪个选项以及它如何符合 MVP 标准。
我想你想将ListBox实现为MVP。查看 选择一个列表框 从 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();
}
以下是我做 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);
}
}
使用列表框的 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));