我试图找出哪一个更符合MVP模式。
假设在我的ViewDesktopImpl类中,我有以下代码:
class ViewDesktopImpl implements View {
ValueListBox<Object> valueListBox
}
现在,这就是我想知道的。执行以下操作会更有意义:
在我的View界面中有一个HasConstrainedValue getter,Presenter调用getHasConstrainedValue并填充它
在我的View界面中有一个setValues(List对象),Presenter调用view.setValues和ViewDesktopImpl处理填充valueListBox
我认为最好采取备选方案1我只想为此获得利弊 - 是的,这可能是一种主观模式,但我想得到一些其他意见和理由,关于哪个选项应该被采取以及它如何符合MVP标准。
答案 0 :(得分:1)
我想你想将ListBox实现为MVP。查看David Chandler
中的SelectOneListBox。如果你的问题与特定小部件无关,我会说有一个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();
}
答案 1 :(得分: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));